Apple M1 チップの macOS 環境で Colima を活用して Testcontainers を実行する方法

Docker Desktop の有料化に伴う代替方法として、Testcontainers を実行する方法を紹介する。

Docker が Docker Desktop の 利用規約 を変更したことで、大企業で働く開発者は Docker Desktop を無料で使えなくなった。 macOS 環境で無料で使うには代替 driver が必要であり、hyperkitVirtualBox など複数の代案が出ているが、現時点では Apple M1 チップの macOS 環境ではまだ使いやすいとは言いにくい。

2023 年 8 月時点の状況は次のとおりである。

  • hyperkit: Apple M1 チップ環境では動作しない。Homebrew でインストールしようとするとエラーになる。
  • VirtualBox: Apple M1 チップ環境で動作可能なバージョンは Beta である。

ここでは Docker Desktop を使わず、Colima を活用して Apple M1 環境で Testcontainers を実行する最も簡単な方法を紹介する。

Docker 設定

まず、Homebrew を使って Docker をインストールする。

brew install docker

Colima 設定

次に、Homebrew を使って Colima をインストールする。

brew install colima

その後、指定した CPU とメモリで Colima を実行する。

colima start --cpu 4 --memory 8

上記のコマンドは VM を 4 CPU、8 GiB メモリで実行している。

Colima サーバーは次の sock アドレスで利用可能になる。

unix:///Users/${HOME}/.colima/default/docker.sock.

Docker クライアントを使って Colima サーバーに接続できる。

docker context ls コマンドを使ってすべてのコンテキストを確認でき、docker context use colima コマンドで Colima に切り替えられる。

% docker context ls
NAME            DESCRIPTION                               DOCKER ENDPOINT                                  ERROR
colima *        colima                                    unix:///Users/user/.colima/default/docker.sock
default         Current DOCKER_HOST based configuration   unix:///var/run/docker.sock
desktop-linux                                             unix:///Users/user/.docker/run/docker.sock

Colima を停止する方法は次のとおりである。

colima stop

Testcontainers 設定

Apple M1

Apple M1 チップで macOS を使っている場合は、少なくとも JNA (Java Native Access) が 5.7.0 以上のバージョンで使われているか確認する必要がある。

IntelliJ IDEA で、依存関係として次のライブラリが含まれているか確認すればよい。

JNA バージョン

もしバージョンが低ければ、5.7.0 に上げればよい。

Testcontainers 環境変数

Colima を使って Testcontainers を実行するには、次の環境変数が必要である。

DOCKER_HOST=unix://${HOME}/.colima/default/docker.sock
TESTCONTAINERS_DOCKER_SOCKET_OVERRIDE=/var/run/docker.sock
TESTCONTAINERS_RYUK_DISABLED=true

これらの環境変数が必要な理由は次のとおりである。

  • DOCKER_HOST: Colima の sock アドレスを指定する。
  • TESTCONTAINERS_DOCKER_SOCKET_OVERRIDE: コンテナ内部の sock アドレスを指定する。
  • TESTCONTAINERS_RYUK_DISABLED: Ryuk を無効化する。無効化しない場合、コンテナが終了せず、テストがタイムアウトすることがある。

Bash/Zsh シェルでは、次のように環境変数を宣言して Docker ホスト を上書きできる。
~/.bashrc or ~/.zshrc

export TESTCONTAINERS_DOCKER_SOCKET_OVERRIDE=/var/run/docker.sock
export DOCKER_HOST="unix://${HOME}/.colima/docker.sock"
export TESTCONTAINERS_RYUK_DISABLED=true

変更後は、環境変更を反映するために IntelliJ IDEA を再起動する必要がある。