💡
vscodeのdev container拡張機能でお手軽開発環境を
古のシステム(15年物)を保守していると。古の開発用PCがどんどん壊れていく。まだかろうじて記憶があるうちに、この環境をどこか別の場所に構築したい。お客様への提案前の検証としてこれを記す。
生成AIにかなり頼ってこれを書いています。(余談ですけど、生成AIは結構古い情報出してきたりするので油断ならない)
環境 Windows7(javaだからlinuxでいいよね)、java8(11にする)、tomcat、oracle(この際だからpostgresqlに乗り換える)、ant(mavenにしたい)、eclipse Luna(重い。vscodeにしたい)、svn(gitにしたいが今回の記事では対象外)
大まかな流れ
- vscodeの導入
- コンテナの作成(dockerfileの作成とイメージビルド)
- コンテナをvscodeから利用(devcontainer.jsonの作成)
- vscodeの導入(詳細は割愛)
- vscodeのインストーラーのダウンロード
- extentionのダウンロード(.vsixファイルをダウンロードしておく)
- コンテナの作成(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
- コンテナを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