MacOS Ventura で buildx を利用して amd64 と arm64 のイメージを作成する
docker buildx でマルチプラットフォームのイメージを作成する - blog.ayakumo.net で紹介した buildx を利用して amd64 と arm64 のイメージを作成していきます。環境は以下になります。
- ビルドマシン(docker コマンド実行環境): Mac mini(2018) Intel Core i7
- OS: Mac OS Ventura 13.3.1
- docker: Docker version 20.10.24, build 297e128
Docker ドキュメンテーションの Building multi-platform images を参考に 3 つのステップごとに実行していきます。
You can build multi-platform images using three different strategies that are supported by Buildx and Dockerfiles:
- Using the QEMU emulation support in the kernel
- Building on multiple native nodes using the same builder instance
- Using a stage in Dockerfile to cross-compile to different architectures
1. QMENU エミュレーションを使用するために tonistiigi/binfmt をインストールする
➜ docker run --privileged --rm tonistiigi/binfmt --install all
2. マルチプラットフォーム用のビルダーインスタンスを作成する
ここでは Docker のドキュメンテーションに倣ってビルダーインスタンスの名前を mybuilder としていますが intel-and-arm-builder など出力先のプラットフォームがわかる名前にしてもよいかもしれません。
➜ docker buildx create --name mybuilder --driver docker-container --bootstrap [+] Building 3.0s (1/1) FINISHED => [internal] booting buildkit 3.0s => => pulling image moby/buildkit:buildx-stable-1 2.2s => => creating container buildx_buildkit_mybuilder0 0.8s mybuilder ➜ docker buildx use mybuilder ➜ docker buildx ls NAME/NODE DRIVER/ENDPOINT STATUS BUILDKIT PLATFORMS mybuilder * docker-container mybuilder0 unix:///var/run/docker.sock running v0.11.6 linux/amd64, linux/amd64/v2, linux/amd64/v3, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/mips64le, linux/mips64, linux/arm/v7, linux/arm/v6 default docker default default running 20.10.24 linux/amd64, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6 desktop-linux docker desktop-linux desktop-linux running 20.10.24 linux/amd64, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6 ➜ docker buildx inspect Name: mybuilder Driver: docker-container Last Activity: 2023-05-13 06:25:09 +0000 UTC Nodes: Name: mybuilder0 Endpoint: unix:///var/run/docker.sock Status: running Buildkit: v0.11.6 Platforms: linux/amd64, linux/amd64/v2, linux/amd64/v3, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/mips64le, linux/mips64, linux/arm/v7, linux/arm/v6
3. Dockerfile を編集して指定したプラットフォーム上のコンテナイメージを作成する
該当コミットはこちらになります: https://github.com/kyagi/ec5/commit/b5bf4488d130e539743eca265b027b43fd5eb9bb
➜ vi Dockerfile
➜ docker buildx build --platform linux/amd64,linux/arm64 .
Dockerfile で echo しているメッセージが対象プラットフォームごとに出力されるのでわかりやすいですね。
このままだとコンテナイメージはキャッシュされるだけでコンテナレジストリには登録されないため --push でレジストリに送ります。
➜ docker buildx build --platform linux/amd64,linux/arm64 -t kyagi/ec5:latest --push .
コンテナレジストリ上で amd64, arm64 の両方のイメージが格納されていることを確認できました。