はじめに
大学の課題でeclipse+amazon corretto17という開発環境の指定が入ったjava開発をやらなきゃいけなくなりました。
IntelliJで慣れてしまっている自分にeclipse(しかも大学のLinuxに入っている英語版)での開発は地獄だったので、いっそのこと自前の開発環境を最近習ったdockerを使って構築してみようと思った次第です。
仮想環境での開発については初心者すぎる筆者が行き当たりばったりで環境構築したので間違いだらけだと思います。積極的にコメント等で指摘していただけると助かります。
Amazon corretto 17 でDev Containerを作成
IntelliJを今回使うPC(今年新調したばかり)に入れるのが初めてだったので、以下のようなwelcome画面から始めることができました。すでにプロジェクトを作成したことがある場合にはどうすればいいか、有識者の方教えていただけますと幸いです。
(6/16追記:友人によると設定の「前回のプロジェクトを開く」という項目をOFFにすれば毎回Welcome画面を出せるとのことです。)
以下の画面でDev Containerを選択し、新規Dev Container作成。
コンテナにマウントして使用したいディレクトリにあらかじめ以下のものを用意しておく。
.devcontainer/devcontainer.json
./Dockerfile
FROM amazoncorretto:17
WORKDIR /usr/src/app
RUN yum update -y && yum install -y procps
CMD [ "java --version" ]
SHELL [ "/bin/bash", "-c" ]
{
"name": "Java Development with Amazon Corretto 17",
"build": {
"dockerfile": "Dockerfile",
"context": ".",
"args": {
}
},
"runArgs": [
"-v", "C:\\Users\\username\\dirname:/usr/src/app"
],
"settings": {
"terminal.integrated.shell.linux": "/bin/bash"
},
"extensions": [
],
"postCreateCommand": "",
"remoteUser": "root"
}
以下の画面でローカルプロジェクトから作成、「devcontainer.jsonへのパス」にプロジェクトを作りたいディレクトリ/.devcontainer/devcontainer.json
を指定して「コンテナーをビルドして続行」
Dockerfile
とdevcontainer.json
が正しい内容で記述できていれば以下の画面になる。
続行ボタンを押すとあとはIntelliJが勝手に環境を作ってくれる。
つまづいた点
Dockerfile
とdevcontainer.json
の内容について、当初は書き方をよく知らないためGithub Copilotを用いて以下のように作成していた。
FROM amazoncorretto:17
WORKDIR /usr/src/app
{
"name": "Java Development with Amazon Corretto 17",
"build": {
"dockerfile": "Dockerfile",
"context": ".",
"args": {
}
},
"runArgs": [
"-v", "C:/Users/username/dirname:/usr/src/app"
],
"settings": {
"terminal.integrated.shell.linux": "/bin/bash"
},
"extensions": [
],
"postCreateCommand": "",
"remoteUser": "root"
}
その結果、以下のようなログとエラーメッセージによりDev Containerに接続することができなかった。
Docker に接続中... 接続済み
[+] Building 0.1s (6/6) FINISHED docker:default
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 81B 0.0s
=> [internal] load metadata for docker.io/library/amazoncorretto:17 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [1/2] FROM docker.io/library/amazoncorretto:17 0.0s
=> [2/2] WORKDIR /usr/src/app 0.0s
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:f37128c0b000caabf40765e5634629ffd07c4aa2685b3 0.0s
=> => naming to docker.io/library/jb-devcontainer-java_development_with_ 0.0sWhat's next:
View a summary of image vulnerabilities and recommendations → docker scout quickview
コンテナーを作成中…
com.fasterxml.jackson.databind.exc.ValueInstantiationException: Cannot construct instance ofcom.github.dockerjava.api.model.Binds
, problem: Error parsing Bind 'C:/Users/username/dirname:/usr/src/app:rw'
そこで、devcontainer.json
のrunargs
を以下のように編集した。
パスの記述をWindowsの方式に変更しただけであるが、これでパスの指定についての問題は解決してしまった。
"runArgs": [
"-v", "C:\\Users\\username\\dirname:/usr/src/app"
// 変更前→ "-v", "C:/Users/username/dirname:/usr/src/app"
]
しかし、依然以下のようなエラーによりDev Containerを正常に作成することができなかった。
Docker に接続中... 接続済み
前の Dev Container を除去中...[+] Building 0.1s (6/6) FINISHED docker:default
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 136B 0.0s
=> [internal] load metadata for docker.io/library/amazoncorretto:17 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [1/2] FROM docker.io/library/amazoncorretto:17 0.0s
=> CACHED [2/2] WORKDIR /usr/src/app 0.0s
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:a1e796c4d4bc8791b50d83152fbb3a263929132623809 0.0s
=> => naming to docker.io/library/jb-devcontainer-java_development_with_ 0.0sWhat's next:
View a summary of image vulnerabilities and recommendations → docker scout quickview
コンテナーを作成中…
コンテナー ID: 96992bb508c5b354f45259df749ca84e41df251c3558e49d1e17fdf5cc1dc647
コンテナー名: '/elastic_herschel'
コンテナー '/elastic_herschel' を起動中
Dev Container 内に必要な依存関係が見つかりません: ps
GitHub Copilotに原因を訪ねたところ、コンテナ起動時にコンテナ内へps
というコマンドをインストールする必要性があるようだった。
Amazon CorrettoのDocker公式イメージはCentOSをベースにビルドされているため、yumコマンドによりコンテナをアップデート(?)するようにDockerfile
を変更した。
FROM amazoncorretto:17
WORKDIR /usr/src/app
RUN yum update -y && yum install -y procps
CMD [ "java --version" ]
SHELL [ "/bin/bash", "-c" ]
その結果として前述の通りDev Containerとの接続ができた。
感想
Dockerって難しい。積極的に活用しながら体で覚えていきたいと思った。
また、GitHub Copilotの信用度がちょっとだけ上がった。
(小学生並みの感想ですみません。)
今後の展望
GitHub経由で大学のLinuxに書いたコードを共有することで、スムーズに指定環境でテストができるようにする。
割と誰でも知っている情報
JetbrainsのIDEとGitHub Copilotは多くの教育機関に属する学生には無償で提供されているので学生の皆さんはぜひとも使っていきましょう。
参考文献