docker/build-push-actionでマルチプラットフォームイメージにタグを打つ
はじめに
私は、GitHubのcontribution数を年または月単位で集計するツールをDockerイメージとして公開しています。
M1 Macを使うようになり(長らく放置していましたが)ARM対応することにしました。
- linux/amd64
- linux/arm64
をサポートするマルチプラットフォームイメージの公開を試みました。単純にdocker tagとdocker pushをすると、linux/amd64とlinux/arm64の片方のみにタグが付いてしまいました。
docker/build-push-actionを利用して解決したため、紹介します。
解決した課題
docker pullやdocker runを実行する環境にあわせて適切なイメージをダウンロードできるようにしました。Docker Hubでは以下のようにOS/ARCHを選択できます。

GitHub Actionsにおける解決方法
Docker公式のGitHub Actionsを利用すると簡単です。
-
docker/setup-qemu-actionを実行する -
docker/setup-buildx-actionを実行する -
platformとtagを指定してdocker/build-push-actionを実行する
mainブランチに対するpushをトリガーとしてdocker push [options] $REPOSITORY:latestするサンプルはこちらです。
GitHubリポジトリでタグを作成したときにdocker push [options] $REPOSITORY:$TAGすることもできます。
実行コマンドの再現
やりたいことはできましたが、もう少し追いかけてみます。どのようなdockerコマンドを実行しているのか、ソースコードを読んで解き明かします。
main.tsを読むと、dockerコマンドの引数にargs変数を指定しているとわかります。
このargsはcontext.tsのgetArgs関数の返り値です。
getBuildArgs関数とgetBuildArgs関数は、設定値をもとにひたすらオプションを追加しています。長いので抜粋します。
前述のサンプルをもとにした、コマンドの再現結果はこちらです。可読性のため適宜改行します。
docker buildx build \
--platform linux/amd64,linux/arm64 \
--tag okepy/contribution:latest \
--push \
.
へー、こうするのですね。知りませんでした。
再現したコマンドをM1 Macで実行
[+] Building 0.0s (0/0)
error: multiple platforms feature is currently not supported for docker driver. Please switch to a different driver (eg. "docker buildx create --use")
むむ、エラーとなりました。以下のIssueを読むと、解決方法に挙げた
docker/setup-qemu-actiondocker/setup-buildx-action
が必要となることがわかります(私はここで満足してしまったため、試していません)。
おわりに
Docker公式のGitHub Actionsを活用することで、簡単にマルチプラットフォームイメージを作成できました。
マルチプラットフォームイメージと言えば、Cybozu Productivity News #2 - 2022.04.28でビルド高速化の方法が紹介されました。docker manifest 知りませんでした。なお、こちらの記事ではマルチアーキテクチャ対応イメージと表現されています。
参考
Discussion