さなけのなさけ

GitHub ActionsでDocker buildxのマルチステージビルドのキャッシュを保存する方法

March 03, 2020

CIでDockerイメージのビルドをするとき、毎回のビルドに1時間近くかかっていると怠くなってきます(Cross platformなイメージを作ると特に)。というわけでメモ。

キャッシュの復元/保存の部分を変えればCircleCIなどのほかでも使えると思います。

コード

- name: Restore Docker build cache
  uses: actions/cache@v1
  with:
    path: buildx-cache
    # どのファイルのハッシュにすればいいのかわからないので
    # コミットハッシュを使っています
    key: docker-buildx-${{ github.sha }}
    restore-keys: |
      # docker-buildx-から始まるキャッシュがあれば復元する
      docker-buildx-

- name: Build and push Docker image
  run: |
    set -eux

    # キャッシュが復元されていれば buildx-cache/index.json が存在する。
    # あれば、キャッシュを読み込む引数 を$DOCKER_ARG_CACHE_FROM に代入しておく。
    # 無ければ、空のまま。
    DOCKER_ARG_CACHE_FROM=""
    if [ -e buildx-cache/index.json ];then
      DOCKER_ARG_CACHE_FROM="--cache-from type=local,src=buildx-cache"
    fi
    # キャッシュが存在しないのに、読み込む引数を与えるとエラーで止まってしまう。

    docker buildx build \
      --platform linux/amd64,linux/arm/v7,linux/arm64 \
      --output "type=image,push=true" \
      --file Dockerfile \
      $DOCKER_ARG_CACHE_FROM \ # キャッシュがあれば引数が与えられる
      --cache-to type=local,mode=max,dest=buildx-cache \
      -t your/repo:tag \ #      ↑  # ここがポイント。超重要。
      . # デフォルトはmode=minで、最後のレイヤーしかキャッシュしてくれない。
      # mode=maxを指定すると全てのレイヤーをキャッシュに出力してくれる。

参考

Q: —cache-to for multi-stage build · Issue #73 · docker/buildx - GitHub

docker/buildx: Docker CLI plugin for extended build capabilities with BuildKit - GitHub


Written by さなけ. Twitter