GitHub Actionでキャッシュを有効にしてDocker Composeを実行する
はじめに
GitHub Actions上で、docker compose
コマンドを使っているワークフローに対して、
Dockerレイヤーキャッシュを有効にしてビルドする方法を記載する。
「キャッシュ」 について
若干、脱線しますがキャッシュについて触れておきます。
- Dockerレイヤーのキャッシュ
- 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