えんじにあメモ

試してみた技術とか、たまに家電ネタ

Github ActionsでDocker公式アクションを使って複数アーキテクチャ向けのDockerイメージを作る

ラズパイ上で動くarmイメージなど、複数アーキテクチャ向けのイメージをGithub Actionsで作成しDockerHubなどのコンテナレジストリにpushする方法をまとめます

以前同様の記事を以下に書きました

sminamot-dev.hatenablog.com

この記事ではbuildxのセットアップに crazy-max/ghaction-docker-buildx を使ってましたが、Docker公式のアクションでできるようになっているのでそちらを試してみます
crazy-max/ghaction-docker-buildx のREADMEにもDocker公式アクションを使うようアナウンスされています)

GitHub Actionsの設定

以下のGitHubリポジトリで試してます

github.com

rootにあるDockerfileをもとに、masterブランチにgit pushを行ったタイミングで linux/arm/v7linux/amd64 のイメージを作成しDockerHubに上げてみます

.github/workflows/docker.yml を作成

name: Publish Docker image
on:
  push:
    branches:
      - master
jobs:
  build:
    name: build and publish
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: Set up QEMU
        uses: docker/setup-qemu-action@v1
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v1
      - name: Login to Docker Hub
        uses: docker/login-action@v1
        with:
          username: ${{ github.repository_owner }}
          password: ${{ secrets.DOCKER_PASSWORD }}
      - name: Build and push
        uses: docker/build-push-action@v2
        with:
          platforms: linux/arm/v7,linux/amd64
          push: true
          tags: ${{ github.repository }}:latest

DockerHubのパスワードは事前にGitHubのsecretsに設定しておきましょう

Settings -> Secrets -> "New repository secret" からyamlに記載したsecrets(DOCKER_PASSWORD)を設定

f:id:shosfs:20210307190359p:plain

↑の例だとpushしたタイミングでgitと同じリポジトリ名(sminamot/docker-actions-multi-arch-image)でDockerHubに上がります

利用できるplatformは以下の通り(Set up Docker Buildxの結果に表示されている)

linux/amd64,linux/arm64,linux/riscv64,linux/ppc64le,linux/s390x,linux/386,linux/arm/v7,linux/arm/v6

docker/build-push-action の platforms にカンマ区切りで追加すれば変更することができます

動作確認

masterブランチにpushすると作ったワークフローが動き出しDocker Hubにイメージがpushされました

https://hub.docker.com/r/sminamot/docker-actions-multi-arch-image/tags

f:id:shosfs:20210321114104p:plain

応用編

応用編としてgit tagを打ったときにそのタグでイメージ作成+Docker Hubへのpushをやってみます

git上のタグは v1.0.0のフォーマットで打ち、Docker Hubに 1.0.0 に上げるパターン

name: Publish Docker image
on:
  push:
    tags:
      - v*
jobs:
  build:
    name: build and publish
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: Set up QEMU
        uses: docker/setup-qemu-action@v1
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v1
      - name: Login to Docker Hub
        uses: docker/login-action@v1
        with:
          username: ${{ github.repository_owner }}
          password: ${{ secrets.DOCKER_PASSWORD }}
      # use tag for image_tag, example:'v1.2.3' -> '1.2.3'
      - name: Set image tag
        run: |
          IMAGE_TAG=${GITHUB_REF##*/v}
          echo "IMAGE_TAG=${IMAGE_TAG}" >> $GITHUB_ENV
      - name: Build and push
        uses: docker/build-push-action@v2
        with:
          platforms: linux/arm/v7,linux/amd64
          push: true
          tags: ${{ github.repository }}:latest,${{ github.repository }}:${{ env.IMAGE_TAG }}

変更点は以下の3つ

  • ワークフローのトリガーを v から始まるgit tagがpushされたときに変更
  • Set image tag のstepを追加
    • git tagから v を除いたタグを環境変数 IMAGE_TAG に設定している
  • Build and push stepのtagsに↑の IMAGE_TAG を追加

その他、各公式アクションで指定可能なパラメータは多くあるため、いろいろとお試しあれ 🙌