🐳

GitHub Actionでキャッシュを有効にしてDocker Composeを実行する

に公開

はじめに

GitHub Actions上で、docker compose コマンドを使っているワークフローに対して、
Dockerレイヤーキャッシュを有効にしてビルドする方法を記載する。

「キャッシュ」 について

若干、脱線しますがキャッシュについて触れておきます。

  1. Dockerレイヤーのキャッシュ
  2. Buildkitによるコンパイラやパッケージマネージャのキャッシュ

詳しくは、Dockerに関するキャッシュたちが参考になります。

一般的に「Dockerのキャッシュ」というと、1.Dockerレイヤーのキャッシュを指すことが多いですが、
2.Buildkitによってコンパイラやパッケージマネージャのキャッシュも可能です。

BuildKitは、Dockerのビルド機能を提供するビルドツールキットで、
RUN --mount=type=cache を使ってキャッシュディレクトリをマウントすることができます。(この記事では触れません。)
また、buildxは、Buildkitに対応したDocker CLIの拡張機能で、
Dockerレイヤーキャッシュを外部に保存・読み込みが可能です。

今回は、1.Dockerレイヤーのキャッシュを実現する。

GitHub Actionsの構成例

.github/workflows/build.yaml のjobsを抜粋

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      # 1. コードチェックアウト
      - name: Checkout
        uses: actions/checkout@v4

      # 2. Buildx セットアップ
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      # 3. Dockerfileからキャッシュ付きでビルド
      - name: Build and Cache
        uses: docker/build-push-action@v6
        with:
          context: .
          file: ./Dockerfile
          tags: sample-app:1.0.0
          load: true
          cache-from: type=gha
          cache-to: type=gha,mode=max

      # 4. docker compose upを実行(ビルドは不要)
      - name: docker compose build & up
        run: |
          docker compose up -d

各ステップの補足

1.コードチェックアウト
actions/checkout を使ってリポジトリのコードを取得します。(詳細説明は割愛)

2.Buildx セットアップ
docker/setup-buildx-action を使って、buildx を有効にします。
これによって、後続のdocker/build-push-action でキャッシュが利用可能になります。

3.Dockerfileからキャッシュ付きでビルド
docker-composeからビルドをせずに、docker/build-push-action を使って
キャッシュを活用しつつイメージをビルドします。

4.docker compose up
すでにビルド済みのイメージを使うため、ここでのビルドは不要です。

docker-compose.yaml の一部を抜粋

services:
  app:
    image: sample-app:1.0.0  # ビルド済みのイメージを指定
    # build: ./ ← docker-compose側でビルドをしない
    ports:
      - "3000:3000"

まとめ

docker-compose.yaml側でビルドを行わず、docker/setup-buildx-actionを使って事前にビルドすることで、
Dockerレイヤーのキャッシュを活用した効率的なビルドが実現できます。

キャッシュの保管先は、github actionsでdockerビルドする時のキャッシュ方法を比較してみたが参考になります。

Discussion