buildx を利用して、マルチアーキテクチャに対応したイメージを生成します
ARM (M1 系統) の Mac が出現してからだいぶ時間が経ちましたが、Docker イメージを使うには Intel や AMD 系のアーキテクチャでビルドしたものは利用できません
ただ、Intel CPU を積んだ Windows や Ubuntu を使った環境と、M 系 macOS 環境で開発を行なったり、GitHub Actions 等が開発環境と異なる場合もあるかなと思います
特に、ビルド時間を短縮したい場合などは、マルチアーキテクチャビルドしておくと便利です
マルチアーキテクチャビルドとは、==環境毎にイメージを作成する機能です (ややゴリ押し)
まあタグ名毎にビルドでもいいんですけど、タグの指定が面倒だったりするので、今回はこれを使ってみます
まずビルダーインスタンスを作成します。指定されているビルダーインスタンスは以下で確認できます
docker build ls特に設定を変更していない場合は default が指定されているのですが、デフォルトのビルダーインスタンスは機能が制限されているため、新たに作成します
mybuilder の部分は、好きな名前で構いません
docker buildx create --name mybuilder作成したら切り替えます
docker buildx use mybuilder最後に起動すれば完了です
docker buildx inspect --bootstrapイメージのビルドにも docker buildx コマンドを使用するのですが、作成したイメージは、ローカル上で保持することができず、ビルドした後にすぐに Docker Hub 等に Push する必要があります
例えば Docker Hub のアカウントを作成して、ログインしておきましょう
docker login -u <username> -p <password>Dockerfile を作成しましょう。今回はカレントディレクトリに、以下のように作成しました
ちなみに uname コマンドは、アーキテクチャを表示するコマンドです
FROM ubuntu:nobleCMD ["uname", "-m"]
以下のコマンドでビルドし Push します
--platform でビルドするアーキテクチャを指定し、-t でタグ名を指定します。<username> は Docker Hub のユーザ名です
docker buildx build --platform linux/amd64,linux/arm64 -t <username>/multi-arch-image --push .これによりマルチアーキテクチャビルドが完了しました 🎉
Docker Hub にアクセスすると linux/amd64 と linux/arm64 の2つのアーキテクチャに対応したイメージをこんな感じで確認できます

ちなみに m1mac で実行したら以下のように表示されました
docker run --rm <username>/multi-arch-imageaarch64Thinkpad (Intel CPU) で実行したら以下のように表示されました
x86_64おわりに
ベースイメージ (FROM) もマルチアーキテクチャ対応している必要があります 🐶