猫でもわかるWeb開発・プログラミング

本業エンジニアリングマネージャー。副業Webエンジニア。Web開発のヒントや、副業、日常生活のことを書きます。

GitHub Actions + GitHub Container Registry (ghcr.io)で target ごとの Docker ビルド

はじめに

私はある個人プロダクトで、Docker を使って開発しており

  • GitHub Actions で Docker イメージをビルド
  • GitHub Container Registry (ghcr.io)にイメージを push
  • ghcr.io からイメージをプルしてデプロイ

ということをよくやっています。

個人開発の場合これがとてもお手軽で便利なのですが、今回、 Dockerfile のマルチステージビルドを使った場合に、target の指定の方法や、ghcr.io への push 方法などが分からなかったので、まとめておきます。

GitHub Container Registry (ghcr.io)について

DockerHub とか、 AWS ECR(Elastic Container Registry)みたいなものです。GitHub にも Docker image を保存できる ghcr.io というのがあります。

GitHub Actions から利用する場合はこんな感じです。

name: Build and Deploy
on:
  push:
    branches: [ master ]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Login GitHub Packages
        uses: docker/login-action@v1.13.0
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}
      - name: Docker のビルドと push
        uses: docker/build-push-action@v2.9.0
        with:
          context: .
          push: true
          tags: ghcr.io/<githubユーザー名>/<イメージ名>

イメージを push すると、リポジトリの右の Packages というところに表示されます。

ghcr.io マルチステージビルドで target を指定したい場合

例えば、 Dockerfile がこうなっているとします

FROM php8.1 as base
...

FROM base as web
...

FROM base as cron
...

このうち、 web と cron を ghcr.io に push したい場合はこうします

単純に、両方ビルドして違う名前で push すればいいだけです。

name: Build and Deploy
on:
  push:
    branches: [ master ]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Login GitHub Packages
        uses: docker/login-action@v1.13.0
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}
      - name: webのビルド
        uses: docker/build-push-action@v2.9.0
        with:
          context: .
          target: web
          push: true
          tags: ghcr.io/<githubユーザー名>/web:latest
      - name: cronのビルド
        uses: docker/build-push-action@v2.9.0
        with:
          context: .
          target: cron
          push: true
          tags: ghcr.io/<githubユーザー名>/cron:latest