Github ActionsでDocker公式アクションを使って複数アーキテクチャ向けのDockerイメージを作る
ラズパイ上で動くarmイメージなど、複数アーキテクチャ向けのイメージをGithub Actionsで作成しDockerHubなどのコンテナレジストリにpushする方法をまとめます
以前同様の記事を以下に書きました
この記事ではbuildxのセットアップに crazy-max/ghaction-docker-buildx を使ってましたが、Docker公式のアクションでできるようになっているのでそちらを試してみます
(crazy-max/ghaction-docker-buildx のREADMEにもDocker公式アクションを使うようアナウンスされています)
GitHub Actionsの設定
rootにあるDockerfileをもとに、masterブランチにgit pushを行ったタイミングで linux/arm/v7
と linux/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)を設定
↑の例だと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
応用編
応用編として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
に設定している
- git tagから
Build and push
stepのtagsに↑のIMAGE_TAG
を追加
その他、各公式アクションで指定可能なパラメータは多くあるため、いろいろとお試しあれ 🙌
- GitHub - docker/setup-qemu-action: GitHub Action to configure Qemu support
- GitHub - docker/setup-buildx-action: GitHub Action to set up Docker Buildx
- GitHub - docker/login-action: GitHub Action to login against a Docker registry
- GitHub - docker/build-push-action: GitHub Action to build and push Docker images with Buildx