Silicon マックで amd64 (x86_64) のアーキテクチャの Docker イメージをビルドするには Colimaを使うと良いらしいので試した。 その覚え書きです。
以前に書いたポスト Multipass + Docker を M1 mac で使う、Ktorアプリをコンテナで実行まで では Multipass + Docker を使っていたところを Colima に差しかえて実行してみます。
動かすアプリは最小限の Ktor アプリを用意その2を使います。
macOS 15.3 を使用。 homebrew は:
$ brew --version
Homebrew 4.4.20
$ brew install colima
この状態で colima start すると次のように怒られる。
dependency check failed for docker: docker not found, run 'brew install docker' to install
そこで、docker を入れます。
$ brew install docker
which して各コマンドにパスが通っていることを確認:
$ which colima
/opt/homebrew/bin/colima
$ which docker
/opt/homebrew/bin/docker
colima start -f するとデフォルトの何かがインストールされるのだが、このマシンは非力なので、 デフォルト設定は荷が重い。CPU や Memory、DISK を明示的に指定してスタートします。
$ colima start --cpu 2 --memory 2 --disk 24 --arch aarch64 \
--vm-type=vz --vz-rosetta --mount-type virtiofs
--vz-rosetta を指定すれば x86_64 (amd64) のバイナリが作動させられるらしい。 ただし、Rosetta2 がインストールされている必要がある。 Rosetta2 がなければ:
WARN[0000] Unable to enable Rosetta: Rosetta2 is not installed
WARN[0000] Run 'softwareupdate --install-rosetta' to install Rosetta2
入れろと言われる。
いったん colima を stop:
$ colima stop
rosetta を入れる:
$ softwareupdate --install-rosetta
colima を再度 start:
$ colima start
たぶん、これでいけるのではないか? 必要ならば colima stop したあと、colima delete して全部消してからやり直すべし。
colima ls で 指定した CPU, Memory, Disk サイズで作動しているか確認できます。
$ colima ls
PROFILE STATUS ARCH CPUS MEMORY DISK RUNTIME ADDRESS
default Running aarch64 2 2GiB 24GiB docker
もうこれで amd64 アーキテクチャの Docker イメージを動かすことができるらしいです。(詳細は未確認です。)
題材としてこれ最小限の Ktor アプリを用意その2を使います。
プロジェクトのルートに Dockerfile を作成:
FROM --platform=linux/amd64 eclipse-temurin:17-jre
WORKDIR /app
COPY app/build/libs/fat.jar fat.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "fat.jar"]
--platform で linux/amd64 を明示的に指定します。
app/build/libs/fat.jar を生成:
$ ./gradlew buildFatJar
このコンテナイメージを生成:
$ docker build -t my-ktor .
DEPRECATED と言われる。とりあえずイメージ作成は成功したので、あとで対処する。
DEPRECATED: The legacy builder is deprecated and will be removed in a future release. Install the buildx component to build images with BuildKit: https://docs.docker.com/go/buildx/
docker image ls か docker images して生成されたコンテナイメージを確認:
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
my-ktor latest 13602c28d892 13 seconds ago 281MB
eclipse-temurin 17-jre af0895d1861a 9 days ago 263MB
動かしてみる。
$ docker run --rm -d -p 8080:8080 my-ktor
architecutre が違うって警告が出る(host は silicon mac なので architecture は linux/arm64/v8 らしい)。
作動を確認してみる。
$ curl -X GET http://localhost:8080/
[
{
"id": 1,
"name": "Pikachu"
},
{
"id": 2,
"name": "Squirtle"
},
{
"id": 3,
"name": "Charamander"
},
{
"id": 4,
"name": "Metapod"
}
]
動いている。Rosetta2 があるからかな。(わからない。)
docker ps -a してプロセスを見る:
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
17f495a31e8f my-ktor "java -jar fat.jar" 2 minutes ago Up 2 minutes 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp festive_edison
container id を指定して停止:
$ docker stop 17f495a31e8f
docker image ls で該当コンテナの IMAGE ID を確認して、 それを指定してコンテナイメージを削除する:
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
my-ktor latest 13602c28d892 6 minutes ago 281MB
eclipse-temurin 17-jre af0895d1861a 9 days ago 263MB
$ docker rmi 13602c28d892 af0895d1861a
colima を停止:
$ colima stop
Docker を使いたいだけならば Colima がよき。そのために Multipass まで入れる必要はなかったようです。
以上です。