♻️
GitHub Actions で docker build cache を利用してみる
概要
GitHub Actions はジョブごとに VM が分かれているため docker build を行う際のレイヤーキャッシュを利用することができません。
単純な docker build であればさほど問題ないのですが、いくつものレイヤーに分かれていたり、時間のかかるビルドなどがある場合は、時間もお金もかかってしまいます。
そこで GitHub Actions で docker build を行う際に、 GitHub Actions Cache service API を利用したレイヤーキャッシュを利用しビルド時間の短縮を行っていきます。
今回利用しているファイルは GitHub に載せてあります。
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