GitHub ActionsでマルチプラットフォームのDockerイメージをビルドしてDockerHubにプッシュするワークフロー
これはInfocom Advent Calendar 2024 10日目の記事です.
今年作ったaz-deployment-denoiseというツールをDockerでも実行できるように対応しました. DockerイメージはGitHub ActionsでビルドしてDockerHubにプッシュしています.そのワークフローについて解説します.
ワークフローファイル
さっそくですがワークフローファイルです. 実体はこちらに置いてあります.
このツールではタグの付与をトリガにビルド&プッシュしています.
name: Publish to DockerHub
on:
push:
tags:
- '*'
jobs:
publish:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Log in to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ vars.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@v5
with:
images: ottijp/az-deployment-denoise
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Build and push Docker image
id: push
uses: docker/build-push-action@v6
with:
push: true
platforms: linux/amd64,linux/arm64
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
DockerHubのトークンの発行
アカウントページから遷移できる”Personal access tokens”ページの”Generate new token”から発行が可能です. プッシュするので”Read & Write”権限が必要です.
GitHubリポジトリへのシークレットの登録
リポジトリの”Settings”ページでDOCKERHUB_USERNAME
という変数とDOCKERHUB_TOKEN
というシークレットを登録します.
使っているアクション
すべてdockerが公式で公開しているアクションです.
docker/login-action
さきほど登録した変数とシークレットを使ってDockerHubにログインするアクションです.
docker/metadata-action
gitのrefから,Dockerイメージの用のラベルやタグを作ってくれるアクションです.
実行すると以後のアクションにおいてsteps.meta.outputs
でメタデータを参照できます.
docker/setup-qemu-action
エミュレータであるQEMUをセットアップしてくれるアクションです.
これがないとGitHub Actionsのランタイム環境(このワークフローではubuntu-latestなのでlinux/amd64
)向けのイメージしかビルドできませんが,
このアクションを定義しておけば,後述するdocker/build-push-action
でマルチプラットフォームのビルドが行えるようになります.
docker/setup-buildx-action
実はよくわかっていませんが,マルチプラットフォームのビルドやイメージのキャッシュを有効化するにはこちらのアクションも必要なようです(?).
docker/build-push-action
これがビルドとプッシュを実際に行うアクションです.
ポイントはplatforms: linux/amd64,linux/arm64
で,これを指定することでマルチプラットフォームのビルドとプッシュが行われます.
プッシュされたイメージ
DockerHubで確認すると,マルチプラットフォーム用のイメージがプッシュされたことが確認できました.