はじめに
私はある個人プロダクトで、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