要約
単一のGitリポジトリ(モノレポ)でマイクロサービスを管理する場合,複数のDockerfileをまとめてビルドする必要がある.この記事ではGitHub Actionsで複数のDockerfileをまとめてビルドし,GitHub Container Registry(ghcr.io)へプッシュする方法を述べる.
動作例を以下に示す.
ディレクトリ構成
ビルドするDockerfileとプロジェクトのディレクトリ構成を以下に示す.プロジェクトルートの配下にあるauthor, front, front-admin, paper, thumbnailがそれぞれのサービスをあらわす.各サービスのコンテナイメージをビルドする場合,それぞれのディレクトリ(例: author)へ移動し,docker build
を実行する必要がある.
.
├── author
│ ├── Dockerfile
│ ├── main.py
│ └── requirements.txt
├── front
│ ├── Dockerfile
│ ├── main.py
│ └── requirements.txt
├── front-admin
│ ├── Dockerfile
│ ├── main.py
│ └── requirements.txt
├── paper
│ ├── Dockerfile
│ ├── main.py
│ ├── requirements.txt
└── thumbnail
├── Dockerfile
├── main.py
└── requirements.txt
構成ファイル
GitHub Actions用の構成ファイルを次に示す.jobs.<job_name>.strategy.matrix.target
にターゲットを列挙する.コンテナレジストリはGitHub Container Registy(ghcr.io)に設定した.コンテナへ付与するタグはGitのコミットハッシュを使った.コンテナのビルド時のターゲット(context)とタグ名を変数 matrix.target
で組み立てることで複数のコンテナイメージのビルドを実現した.
name: Build container images
on:
push:
branches:
- master
jobs:
build-and-push:
runs-on: ubuntu-20.04
permissions:
contents: read
packages: write
# 複数のDockerfileが配置されたディレクトリを列挙
strategy:
matrix:
target: ["author", "front-admin", "front", "paper", "thumbnail"]
steps:
- name: Checkout repository
uses: actions/checkout@v2
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
- name: Log in to the Container registry
uses: docker/login-action@v1
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Set image tag for master
if: github.ref == 'refs/heads/master'
run: |
COMMITID=$(git rev-parse --short ${{ github.sha }})
echo "DOCKER_TAG=master-${COMMITID}" >> $GITHUB_ENV
# 並列でContainer Imageをビルド
- name: Build and push Docker image
uses: docker/build-push-action@v2
with:
context: ./${{ matrix.target }}
push: true
tags: ghcr.io/cdsl-research/${{ matrix.target }}:${{ env.DOCKER_TAG }}
おわりに
GitHub Actionsでのコンテナイメージの並列ビルドが思った以上に簡単にできた.target
に指定するDockerfileの存在するサブディレクトリを自動的に検出できるとハードコードが必要なくなり良いと思った.