LoginSignup
5
2

More than 1 year has passed since last update.

GitHub Actionsで複数のDockerfileをまとめてビルド

Last updated at Posted at 2021-09-15

要約

単一のGitリポジトリ(モノレポ)でマイクロサービスを管理する場合,複数のDockerfileをまとめてビルドする必要がある.この記事ではGitHub Actionsで複数のDockerfileをまとめてビルドし,GitHub Container Registry(ghcr.io)へプッシュする方法を述べる.

動作例を以下に示す.

image.png

image2.png

ディレクトリ構成

ビルドする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 で組み立てることで複数のコンテナイメージのビルドを実現した.

image-build.yml
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の存在するサブディレクトリを自動的に検出できるとハードコードが必要なくなり良いと思った.

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2