💡

vscodeのdev container拡張機能でお手軽開発環境を

2024/04/29に公開

古のシステム(15年物)を保守していると。古の開発用PCがどんどん壊れていく。まだかろうじて記憶があるうちに、この環境をどこか別の場所に構築したい。お客様への提案前の検証としてこれを記す。
生成AIにかなり頼ってこれを書いています。(余談ですけど、生成AIは結構古い情報出してきたりするので油断ならない)


環境 Windows7(javaだからlinuxでいいよね)、java8(11にする)、tomcat、oracle(この際だからpostgresqlに乗り換える)、ant(mavenにしたい)、eclipse Luna(重い。vscodeにしたい)、svn(gitにしたいが今回の記事では対象外)


大まかな流れ

  1. vscodeの導入
  2. コンテナの作成(dockerfileの作成とイメージビルド)
  3. コンテナをvscodeから利用(devcontainer.jsonの作成)
  1. vscodeの導入(詳細は割愛)
    1. vscodeのインストーラーのダウンロード
    2. extentionのダウンロード(.vsixファイルをダウンロードしておく)
  2. コンテナの作成(dockerfileの作成とイメージビルド)
FROM alpine:latest

# 環境変数の設定
ENV JAVA_HOME=/usr/lib/jvm/java-11-openjdk
ENV CATALINA_HOME=/opt/tomcat
ENV PATH="$JAVA_HOME/bin:$CATALINA_HOME/bin:$PATH"

# 必要なパッケージのインストール
RUN apk update && apk add --no-cache openjdk11-jdk postgresql maven

# PostgreSQLの設定
RUN mkdir /var/lib/postgresql/data && \
    chown -R postgres:postgres /var/lib/postgresql/data && \
    mkdir /run/postgresql && \
    chown postgres:postgres /run/postgresql/ && \
    su - postgres -c "initdb -D /var/lib/postgresql/data" 

# Allow Remote Connections via Password Authentication 
# RUN echo "host all all 0.0.0.0/0 md5" >> /var/lib/postgresql/data/pg_hba.conf && \
# echo "listen_addresses='*'" >> /var/lib/postgresql/data/postgresql.conf

# Tomcatのtarファイルをコピーして展開(予めローカルにダウンロード)
COPY apache-tomcat-9.0.88.tar.gz /tmp/
RUN mkdir /opt/tomcat
RUN tar xvzf /tmp/apache-tomcat-9.0.88.tar.gz --strip-components 1 --directory /opt/tomcat

COPY start.sh /start.sh
RUN chmod +x /start.sh

# ポートの公開
EXPOSE 5432 8080

# コンテナが起動したときにstart.shを実行するように設定
# (cmdだとなぜか動かない)>>どうもdevcontainerでは、ENTRYPOINTやCMDは機能しない??
# CMD ["/start.sh"]

偉い人にはalpineとか馴染みじゃないからubuntuあたりをベースイメージにしないといけないんだろうけど。こいつを持ち込み用にtarに固める。*初期スクリプトは今回は作成しない。起動用スクリプトとかデータインポートとか。

Dockerfileのあるディレクトリで(タグはなんでも良い。Docker商用ライセンスは買ってくれないのでpodmanで代用)

podman build -t java-dev:latest .

エキスポート

podman save -o java-dev.tar java-dev:latest

インポート

podman load -i java-dev.tar

  1. コンテナをvscodeから利用(devcontainer.jsonの作成)
    拡張機能は.vsixからインストールしておく。dev containerは必須。
{
    "name": "Alpine Java-Tomcat-PostgreSQL",
    "context": ".",
    // "dockerFile": "Dockerfile",
    "image": "java-dev:latest",
    "customizations": {
        "vscode": {
            "extensions": [
                // インターネットさえ使えたら拡張機能インストールの手間さえ省けるのに
                // "vscjava.vscode-java-pack",
                // "redhat.java",
                // "vscjava.vscode-maven",
                // "vscjava.vscode-java-debug"
            ], 
            "settings": {}
        }
    },
    "runArgs": [
        // "--cap-add=SYS_PTRACE",
        // "--security-opt",
        // "seccomp=unconfined"
    ],
    "mounts": [
        // ホストPCのフォルダをマウント(ここにソースコードを置く予定)
                "source=${localWorkspaceFolder},target=/workspaces,type=bind,consistency=cached"
    ],
    "forwardPorts": [
        5432, // PostgreSQL
        8080  // Tomcat
    ],
    "postCreateCommand": "/start.sh",
    "remoteUser": "root"
}

shellのなかみ

#!/bin/sh

# PostgreSQLを起動する
su - postgres -c "pg_ctl -D /var/lib/postgresql/data -l logfile start"

# Tomcatを起動
/opt/tomcat/bin/catalina.sh run

一旦コンテナが動くところまで、開発するにはまだ色々仕込まないといけない。
vscodeでF1を押してコンテナを開く。

コンテナ2つに分割した。

tomcat

# 使用するベースイメージ
FROM alpine:latest

# 環境変数の設定
ENV JAVA_HOME=/usr/lib/jvm/java-11-openjdk
ENV CATALINA_HOME=/opt/tomcat
ENV PATH="$JAVA_HOME/bin:$CATALINA_HOME/bin:$PATH"

# 必要なパッケージのインストール
RUN apk update && apk add --no-cache openjdk11-jdk maven

# Tomcatのtarファイルをコピーして展開
COPY apache-tomcat-9.0.88.tar.gz /tmp/
RUN mkdir /opt/tomcat
RUN tar xvzf /tmp/apache-tomcat-9.0.88.tar.gz --strip-components=1 --directory /opt/tomcat

# スタートスクリプトのコピーと実行設定
COPY start.sh /tmp/start.sh
RUN chmod +x /tmp/start.sh

# ポート8080を公開
EXPOSE 8080

# コンテナが起動したときにTomcatを実行
ENTRYPOINT ["/opt/tomcat/bin/catalina.sh", "run"]

PostgreSQL

# 使用するベースイメージ
FROM alpine:latest

# 必要なパッケージのインストール
RUN apk update && apk add --no-cache postgresql

# PostgreSQLのデータディレクトリと実行ディレクトリの設定
RUN mkdir /var/lib/postgresql/data && \
    chown -R postgres:postgres /var/lib/postgresql/data && \
    mkdir /run/postgresql && \
    chown postgres:postgres /run/postgresql/ && \
    su - postgres -c "initdb -D /var/lib/postgresql/data"

# リモート接続の設定を追加
RUN echo "host all all 0.0.0.0/0 md5" >> /var/lib/postgresql/data/pg_hba.conf && \
    echo "listen_addresses='*'" >> /var/lib/postgresql/data/postgresql.conf

# ポート5432を公開
EXPOSE 5432

# PostgreSQLを起動
ENTRYPOINT ["su", "-", "postgres", "-c", "postgres -D /var/lib/postgresql/data"]

まだまだ工事中でdevcontainer.jsonを直したりとかcompose.yamlも作成しないといけない。

現場を離れるまでに環境を構築できる許可が出るだろうか・・・

Discussion