Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
0
Help us understand the problem. What are the problem?

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

要約

単一の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
    strategy:
      matrix:
        target: ["author", "front-admin", "front", "paper"]
    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
      - 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の存在するサブディレクトリを自動的に検出できるとハードコードが必要なくなり良いと思った.

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
0
Help us understand the problem. What are the problem?