♻️

GitHub Actions で docker build cache を利用してみる

2023/12/30に公開

概要

GitHub Actions はジョブごとに VM が分かれているため docker build を行う際のレイヤーキャッシュを利用することができません。
単純な docker build であればさほど問題ないのですが、いくつものレイヤーに分かれていたり、時間のかかるビルドなどがある場合は、時間もお金もかかってしまいます。

そこで GitHub Actions で docker build を行う際に、 GitHub Actions Cache service API を利用したレイヤーキャッシュを利用しビルド時間の短縮を行っていきます。

https://docs.github.com/en/actions/using-workflows/caching-dependencies-to-speed-up-workflows

https://docs.docker.com/build/cache/backends/gha/

今回利用しているファイルは GitHub に載せてあります。
https://github.com/tetsuya28/samples/tree/main/github-actions/docker-build-cache

GitHub Actions

まずは最終的に利用している GitHub Actions の workflow を載せておきます。

name: docker-build-cache

on:
  push:
    branches:
      - main
    paths:
      - .github/workflows/docker-build-cache.yaml
      - github-actions/docker-build-cache/**

defaults:
  run:
    working-directory: github-actions/docker-build-cache

jobs:
  build:
    name: build
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Set up buildx
        uses: docker/setup-buildx-action@v3

      - name: Set metadata
        id: metadata
        uses: docker/metadata-action@v5
        with:
          images: asia-northeast1-docker.pkg.dev
          tags: |
            type=semver,pattern={{raw}} # tag を利用
            type=sha,format=short       # sha を利用

      - name: Build
        uses: docker/build-push-action@v5
        with:
          context: github-actions/docker-build-cache
          push: false
          tags: ${{ steps.metadata.outputs.tags }}
          cache-from: type=gha
          cache-to: type=gha,mode=max # 全レイヤーキャッシュ

動作確認

初回実行時はキャッシュがないので通常通り docker build が行われます。

このジョブが終了した際に GitHub Actions のキャッシュがレイヤーごとに生成されます。

この状態で、ビルドを行うと先ほど作成されたキャッシュを用いて docker build が行われます。

まとめ

このように buildx を利用し、 cache-from / cache-to を設定するだけで GitHub Actions に完結してキャッシュを利用しながら docker build を行うことができます。

Discussion