ottijp blog

GitHub ActionsでマルチプラットフォームのDockerイメージをビルドしてDockerHubにプッシュするワークフロー

  • 2024-12-10

これはInfocom Advent Calendar 2024 10日目の記事です.

今年作ったaz-deployment-denoiseというツールをDockerでも実行できるように対応しました. DockerイメージはGitHub ActionsでビルドしてDockerHubにプッシュしています.そのワークフローについて解説します.

ワークフローファイル

さっそくですがワークフローファイルです. 実体はこちらに置いてあります.

このツールではタグの付与をトリガにビルド&プッシュしています.

.github/workflows/publish-docker.yml
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”権限が必要です.

dockerhub token

GitHubリポジトリへのシークレットの登録

リポジトリの”Settings”ページでDOCKERHUB_USERNAMEという変数とDOCKERHUB_TOKENというシークレットを登録します.

github variables

github secrets

使っているアクション

すべて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で確認すると,マルチプラットフォーム用のイメージがプッシュされたことが確認できました.

pushed multi image


ottijp
都内でアプリケーションエンジニアをしています
© 2024, ottijp