docker buildx でマルチプラットフォームのイメージを作成する その2

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:

  1. Using the QEMU emulation support in the kernel
  2. Building on multiple native nodes using the same builder instance
  3. Using a stage in Dockerfile to cross-compile to different architectures

https://docs.docker.com/build/building/multi-platform/

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 の両方のイメージが格納されていることを確認できました。

参考情報