Intellij IDEAとDockerでAmazon corretto17 open jdkでの開発環境を作ってみた

## はじめに
大学の課題でeclipse+amazon corretto17という開発環境の指定が入ったjava開発をやらなきゃいけなくなりました。
IntelliJで慣れてしまっている自分にeclipse（しかも大学のLinuxに入っている英語版）での開発は地獄だったので、いっそのこと自前の開発環境を最近習ったdockerを使って構築してみようと思った次第です。
仮想環境での開発については初心者すぎる筆者が行き当たりばったりで環境構築したので間違いだらけだと思います。積極的にコメント等で指摘していただけると助かります。

## Amazon corretto 17 でDev Containerを作成
IntelliJを今回使うPC（今年新調したばかり）に入れるのが初めてだったので、以下のようなwelcome画面から始めることができました。すでにプロジェクトを作成したことがある場合にはどうすればいいか、有識者の方教えていただけますと幸いです。

（6/16追記：友人によると設定の「前回のプロジェクトを開く」という項目をOFFにすれば毎回Welcome画面を出せるとのことです。）

以下の画面でDev Containerを選択し、新規Dev Container作成。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125104/fa0d70b5-fb20-40ed-b5fc-ae096c3cf764.png)

コンテナにマウントして使用したいディレクトリにあらかじめ以下のものを用意しておく。
- `.devcontainer/devcontainer.json`
- `./Dockerfile`

```dockerfile
FROM amazoncorretto:17
WORKDIR /usr/src/app
RUN yum update -y && yum install -y procps
CMD [ "java --version" ]
SHELL [ "/bin/bash", "-c" ]
```

```devcontainer.json
{
  "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`を指定して「コンテナーをビルドして続行」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125104/5a25cd3e-da5b-8c9f-fe4b-3230e2018f68.png)

`Dockerfile`と`devcontainer.json`が正しい内容で記述できていれば以下の画面になる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125104/6509688d-aa2d-7d43-9779-6538bb54a92b.png)

続行ボタンを押すとあとはIntelliJが勝手に環境を作ってくれる。

## つまづいた点
`Dockerfile`と`devcontainer.json`の内容について、当初は書き方をよく知らないためGithub Copilotを用いて以下のように作成していた。

```Dockerfile
FROM amazoncorretto:17
WORKDIR /usr/src/app
```

```devcontainer.json
{
  "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.0s
> 
> What's next:
>     View a summary of image vulnerabilities and recommendations → docker scout quickview 
> コンテナーを作成中…
> com.fasterxml.jackson.databind.exc.ValueInstantiationException: Cannot construct instance of `com.github.dockerjava.api.model.Binds`, problem: Error parsing Bind 'C:/Users/username/dirname:/usr/src/app:rw'

そこで、`devcontainer.json`の`runargs`を以下のように編集した。
パスの記述をWindowsの方式に変更しただけであるが、これでパスの指定についての問題は解決してしまった。

```devcontainer.json
"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.0s
>
>What'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`を変更した。

```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は多くの教育機関に属する学生には無償で提供されているので学生の皆さんはぜひとも使っていきましょう。

## 参考文献
https://qiita.com/hiromu00/items/47212bb7c3190cfc10dc

https://itc.tokyo/docker/dockerfile/

https://www.jetbrains.com/help/idea/docker.html#create_devcontainer_on_remote