M1 Mac に colima をインストールして IntelliJ で実行できるようにするまで
M1 Mac に Docker Desktop の 代わりに colima をインストールし、IntelliJ IDEA からdocker
と docker compose
コマンドを使って実行できるようにした
今回試したバージョンとスペック
- M1 Mac
- chip: M1 Pro
- memory: 16GB
- OS: Sonoma 14.2.1
- IntelliJ IDEA
- Ultimate 2023.3.2
- Homebrewでインストールしたパッケージ
- colima: 0.6.7
- docker: 24.0.7
- docker-compose: 2.23.3
- docker-credential-helper: 0.8.0
要約すると以下の通り(コンテナ Runtime は Docker を採用)
1. colima, docker を インストール
> brew install colima docker
2. docker-compose を インストール
> brew install docker-compose
> mkdir -p ~/.docker/cli-plugins
> ln -sfn /opt/homebrew/opt/docker-compose/bin/docker-compose ~/.docker/cli-plugins/docker-compose
3. docker-credential-helper をインストール
> brew install docker-credential-helper
> vim ~/.docker/config.json
{
"auths": {},
"credsStore": "osxkeychain",
"currentContext": "colima"
}
intelliJ IDEA の 設定
- Settings > Build, Execution, Deployment > Docker
- Serviceを追加して接続先に Colimaを選択する
- Settings > Build, Execution, Deployment > Docker > tools
- docker と docker compose の両方の実行パスに
/opt/homebrew/bin/docker
を指定する
以上
MacOS を 15(Sequoia) に変えたところ qemu
のインストールが別途必要になった模様で、brew で install を求められた。(以前は依存関係として自動でインストールされていた?)
恐らくこのIssueが関係しているようで、colima 0.8.0 から依存関係に追加されている。ただ brew で自動でインストールされなかったので、個別に qemu をインストールして対応した
colima の githubを見る感じ、最新の0.8.0 なら qemu を別途インストールしなくても良いのかなと思ったんだけどダメっぽいので、とりあえず qemu もインストールしたままにしておく
先に インストール済みだった Docker Desktop をアンインストールする
- homebrew を使ったので
brew rm --cask docker
を実行する -
$HOME/.docker/cli-plugins
ディレクトリに docker desktop アプリのプラグインへのsymbolicリンクが残っていたので cli-plugins ディレクトリごと削除する
colima をインストールする
ドキュメント通り、homebrew install colima
を実行する
インストール後、colima start
を実行すると エラーが出ており 起動はしているが正常に動作しない状態だったので、colima delete
でインスタンスを一旦削除した後、再度 colima start
を実行したら今度は正常に起動できた
brew services start colima
を実行し、Mac起動時に colimaを自動起動するようにした
コンテナランタイムは Docker を利用するため、brew install docker
でインストールする
containerd も使ってみようかと思ったが、IntelliJ IDEA から実行(nerdctl
での実行)できるか不明だったので試していない
IntelliJ IDEA の Dockerプラグインがサポートしているのは dockerd だけだった
IntelliJ IDEA から 利用できるようにする
Settings > Build, Execution, Deployment > Docker から、Serviceを追加し、Connect to Docker daemon with から Colima
を選択する
Tools で、Docker executable と Docker Compose executable のPathを設定する。
尚、画像は最後の状態なので Docker compose の実行パスを認識しているが、実際にはまだDocker composeをインストールしていないので実行パス入力時は認識していない旨のメッセージが表示される
brew docker-compose
で、Docker compose を インストールする
インストール時にターミナルにも注意表示が出るが Docker compose は Docker plugin として扱われるため、以下の通り .docker/cli-plugins
に シンボリックリンクを追加することで docker compose
コマンドとして認識される。 IntelliJ からも 利用できるようになる
❯ mkdir -p ~/.docker/cli-plugins
❯ ln -sfn /opt/homebrew/opt/docker-compose/bin/docker-compose ~/.docker/cli-plugins/docker-compose
❯ docker compose version
Docker Compose version 2.23.3
IntelliJ から 既存の compose.yml を実行した所、以下のようなエラーが出力された。どうやら Imageのダウンロードで失敗した模様。
Error saving credentials: error storing credentials - err: exec: "docker-credential-desktop": executable file not found in $PATH, out: ``
Colimaの Issue に同様の問題がありそのコメント内でリンクされていた stackoverflowの回答を元に brew docker-credential-helper
をインストールし、~/.docker/config.json
の credsStore
を Desktop
から osxkeychain
に変更したら解決した
{
"auths": {},
"credsStore": "osxkeychain",
"currentContext": "colima",
"plugins": {
"-x-cli-hints": {
"enabled": "true"
}
}
}
Stackoverflowの回答では、最後に Docker Hub へのログインを行なっていたが 今回は特に不要だと思う。
("思う" なのは、一旦ログインしてしまったので確証がまだ無いため)
また、docker-credential-helper
をインストールせずに、 config.json の creadsStore
プロパティ自体を削除するだけでもアクセスできそう
以上で、Docker Desktop for mac を使っていた時と同様の状態にはなったので、しばらくこの環境で使ってみる
Colima で起動するVMインスタンスのデフォルトスペックは CPU: 2, Memory: 2GB, Disk: 60GB だそう。変更したい場合は、colima 起動時に colima start --cpu 4 --memory 8 --disk 10
のように指定できる
もしくは config ファイルで 設定できそう
~/.colima/<profile-name>/colima.yaml
で、プロファイルごとの設定を定義することができる。
初期は default プロファイルだけが作成されているので、このファイルで設定を変更したり、新たなプロファイルを用意してColimaを再起動する。再起動するときに -p or --profile <profile-name>
を付ければ指定したプロファイルで起動してくれそう
今回は default プロファイルの Memoryを変更する事にした
# Number of CPUs to be allocated to the virtual machine.
# Default: 2
cpu: 2
# Size of the disk in GiB to be allocated to the virtual machine.
# NOTE: changing this has no effect after the virtual machine has been created.
# Default: 60
disk: 60
# Size of the memory in GiB to be allocated to the virtual machine.
# Default: 2
memory: 4
# Architecture of the virtual machine (x86_64, aarch64, host).
# Default: host
arch: aarch64
# Container runtime to be used (docker, containerd).
# Default: docker
runtime: docker
# Set custom hostname for the virtual machine.
# Default: colima
# colima-profile_name for other profiles
hostname: colima
......
Dockerコンテナは正常に起動しているのにアクセスが出来なくなった場合は、colima restart
で再起動してコンテナを立ち上げ直すと繋がった
今日 brew update で lima を更新したところ、colimaが自動起動されなくなり restartを実行したところ FATA[0004] error starting vm: error at 'starting': exit status 1
が出力された
Issueを調べたところ colima delete
で一旦 VMを削除して colima start
で作り直す必要があった模様。
起動するようにはなったが、profileもリセットされたので修正を行った
VM作り直したから コンテナもイメージもボリュームもみんな消えたので再作成が必要
開発環境なので致命的ではないが必要なら vm 削除前に少なくともボリュームはバックアップしておかないと
今日は colima delete
を行っても次のようなエラーが出て先に進めなかった
failed to stop usernet "user-v2": Get "http://lima/services/dhcp/leases": dial unix /Users/***/.colima/_lima/_networks/user-v2/user-v2_ep.sock: connect: connection refused FATA[0003] error during teardown of vm: exit status 1
Issueを見たところ次のコメントの通り rm -rf ~/.colima/_lima/_networks/user-v2
を行ってから colima start
で起動することができた! ひょっとしたら colima delete
は不要だったかもしれないので次回同様の問題が起こった時に確認する
rm -rf ~/.colima/_lima/_networks/user-v2
を行ってから colima start
で大丈夫だった
Javaのテストコードで Testcontainers を使っているときに Caused by: java.lang.IllegalStateException: Could not find a valid Docker environment. Please see logs and check configuration
というエラーが出る。
これは Testcontainer 側から Dockerを実行しようとして Colimaへのパスが参照できていないのが問題みたい。
GitHub の Issue の このコメント の通り、環境変数を2つ定義すれば実行してくれるようになる
export TESTCONTAINERS_DOCKER_SOCKET_OVERRIDE=/var/run/docker.sock
export DOCKER_HOST="unix://${HOME}/.colima/docker.sock"
IntelliJ IDEA から テストを実行する場合は、実行Configurationのこれらの環境変数を追加すること
その際、DOCKER_HOST
の方は unix://$HOME$/.colima/docker.sock
とする
Testcontainerの 公式ドキュメント だと、export TESTCONTAINERS_HOST_OVERRIDE=$(colima ls -j | jq -r '.address')
も必要になっているが 無くてもいけそうなので設定しないことにする。
ちなみに 必要だと colima start --network-address
と アドレスを有効にする必要があるのと、IntelliJの環境変数設定で $(colima ls -j | jq -r '.address')
で アドレスが取れずにエラーとなるため、事前にアドレスを抽出する手間があるのも設定しない理由(方法があれば知りたい)
ntelliJ IDEA から テストを実行する場合は、実行Configurationのこれらの環境変数を追加すること
Configuration Template で、JUnit の 実行に対して追加すると テスト設定ごとに追加する必要がないので便利