Closed21

M1 Mac に colima をインストールして IntelliJ で実行できるようにするまで

kazokmrkazokmr

M1 Mac に Docker Desktop の 代わりに colima をインストールし、IntelliJ IDEA からdockerdocker 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
kazokmrkazokmr

要約すると以下の通り(コンテナ 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 の 設定

  1. Settings > Build, Execution, Deployment > Docker
  • Serviceを追加して接続先に Colimaを選択する
  1. Settings > Build, Execution, Deployment > Docker > tools
  • docker と docker compose の両方の実行パスに /opt/homebrew/bin/docker を指定する

以上

kazokmrkazokmr

先に インストール済みだった Docker Desktop をアンインストールする

  1. homebrew を使ったので brew rm --cask docker を実行する
  2. $HOME/.docker/cli-plugins ディレクトリに docker desktop アプリのプラグインへのsymbolicリンクが残っていたので cli-plugins ディレクトリごと削除する
kazokmrkazokmr

colima をインストールする

ドキュメント通りhomebrew install colima を実行する

インストール後、colima start を実行すると エラーが出ており 起動はしているが正常に動作しない状態だったので、colima delete でインスタンスを一旦削除した後、再度 colima start を実行したら今度は正常に起動できた

brew serveces start colima を実行し、Mac起動時に colimaを自動起動するようにした
https://github.com/abiosoft/colima/tree/main?tab=readme-ov-file#getting-started

kazokmrkazokmr

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をインストールしていないので実行パス入力時は認識していない旨のメッセージが表示される

kazokmrkazokmr

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

https://formulae.brew.sh/formula/docker-compose

kazokmrkazokmr

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.jsoncredsStoreDesktop から osxkeychain に変更したら解決した

{
  "auths": {},
  "credsStore": "osxkeychain",
  "currentContext": "colima",
  "plugins": {
    "-x-cli-hints": {
      "enabled": "true"
    }
  }
}

https://github.com/abiosoft/colima/issues/265

https://stackoverflow.com/questions/67642620/docker-credential-desktop-not-installed-or-not-available-in-path/72888813#72888813

kazokmrkazokmr

Stackoverflowの回答では、最後に Docker Hub へのログインを行なっていたが 今回は特に不要だと思う。
("思う" なのは、一旦ログインしてしまったので確証がまだ無いため)

また、docker-credential-helper をインストールせずに、 config.json の creadsStore プロパティ自体を削除するだけでもアクセスできそう

kazokmrkazokmr

以上で、Docker Desktop for mac を使っていた時と同様の状態にはなったので、しばらくこの環境で使ってみる

kazokmrkazokmr

Colima で起動するVMインスタンスのデフォルトスペックは CPU: 2, Memory: 2GB, Disk: 60GB だそう。変更したい場合は、colima 起動時に colima start --cpu 4 --memory 8 --disk 10 のように指定できる

https://github.com/abiosoft/colima?tab=readme-ov-file#customizing-the-vm

もしくは config ファイルで 設定できそう
https://github.com/abiosoft/colima/blob/main/docs/FAQ.md#can-config-file-be-used-instead-of-cli-flags

kazokmrkazokmr

~/.colima/<profile-name>/colima.yaml で、プロファイルごとの設定を定義することができる。
初期は default プロファイルだけが作成されているので、このファイルで設定を変更したり、新たなプロファイルを用意してColimaを再起動する。再起動するときに -p or --profile <profile-name> を付ければ指定したプロファイルで起動してくれそう

今回は default プロファイルの Memoryを変更する事にした

colima.yaml
# 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

......
kazokmrkazokmr

Dockerコンテナは正常に起動しているのにアクセスが出来なくなった場合は、colima restart で再起動してコンテナを立ち上げ直すと繋がった

kazokmrkazokmr

今日 brew update で lima を更新したところ、colimaが自動起動されなくなり restartを実行したところ FATA[0004] error starting vm: error at 'starting': exit status 1 が出力された

Issueを調べたところ colima delete で一旦 VMを削除して colima start で作り直す必要があった模様。
起動するようにはなったが、profileもリセットされたので修正を行った

kazokmrkazokmr

VM作り直したから コンテナもイメージもボリュームもみんな消えたので再作成が必要
開発環境なので致命的ではないが必要なら vm 削除前に少なくともボリュームはバックアップしておかないと

kazokmrkazokmr

今日は 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 は不要だったかもしれないので次回同様の問題が起こった時に確認する

https://github.com/abiosoft/colima/issues/938#issuecomment-1895461764

kazokmrkazokmr

rm -rf ~/.colima/_lima/_networks/user-v2 を行ってから colima start で大丈夫だった

kazokmrkazokmr

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 とする

kazokmrkazokmr

Testcontainerの 公式ドキュメント だと、export TESTCONTAINERS_HOST_OVERRIDE=$(colima ls -j | jq -r '.address') も必要になっているが 無くてもいけそうなので設定しないことにする。

ちなみに 必要だと colima start --network-address と アドレスを有効にする必要があるのと、IntelliJの環境変数設定で $(colima ls -j | jq -r '.address') で アドレスが取れずにエラーとなるため、事前にアドレスを抽出する手間があるのも設定しない理由(方法があれば知りたい)

kazokmrkazokmr

ntelliJ IDEA から テストを実行する場合は、実行Configurationのこれらの環境変数を追加すること

Configuration Template で、JUnit の 実行に対して追加すると テスト設定ごとに追加する必要がないので便利

このスクラップは2024/01/08にクローズされました