ECRにリモートキャッシュ(--cache-to)のmode=maxでイメージプッシュする
2023/11/16 に BuildKit クライアント用の Amazon ECR でのリモートキャッシュサポートの発表 | Amazon Web Services ブログ
という記事が発表されて、イメージビルド時のcache-to
のオプションmode=max
が使えるようになった。
待望のアップデート。このissueを見たらどれだけ待ち望まれていたかが分かる。
以前まではECRはリモートキャッシュマニフェストに対応していなかったため、リモートキャッシュ先にECRを指定する場合はtype=inline
を指定する必要があった。(参考: Github Actionsのdocker/build-push-actionのcache-toにECRを指定する)
type=inline
だとmode=min
しか指定出来ない。mode=min
だと結果イメージのレイヤーしかキャッシュされず、マルチステージビルドを使用している場合中間イメージがキャッシュされず、イメージビルドが速くならないという問題があった。
max=mode
はすべてのレイヤーをキャッシュするので、中間イメージが更新されてもキャッシュが効いてイメージビルドが速くなる。
リモートキャッシュに関しては Cache storage backends | Docker Docs を参照。
設定例
GitHub Actions
- name: Login to Amazon ECR id: login-ecr uses: aws-actions/amazon-ecr-login@v1 - uses: docker/build-push-action@v3 with: push: true tags: ${{ steps.login-ecr.outputs.registry }}/${{ env.REPOSITORY_NAME }}:${{ github.sha }} provenance: false cache-from: type=registry,ref=${{ steps.login-ecr.outputs.registry }}/${{ env.REPOSITORY_NAME }}:buildcache cache-to: type=registry,mode=max,image-manifest=true,oci-mediatypes=true,ref=${{ steps.login-ecr.outputs.registry }}/${{ env.REPOSITORY_NAME }}:buildcache
CircleCI
- run: name: create builder instance # ビルダーインスタンスを作成しないとエラーになる command: docker buildx create --use - aws-ecr/build_and_push_image: account_id: ${AWS_ACCOUNT_ID} auth: - aws-cli/setup: role_arn: ${AWS_ROLE_ARN} region: ${AWS_DEFAULT_REGION} push_image: true region: ${AWS_DEFAULT_REGION} repo: ${REPOSITORY_NAME} tag: ${CIRCLE_SHA1} extra_build_args: >- --cache-from type=registry,ref=${REGISTRY_URL}/${REPOSITORY_NAME}:buildcache --cache-to type=registry,mode=max,image-manifest=true,oci-mediatypes=true,ref=${REGISTRY_URL}/${REPOSITORY_NAME}:buildcache --provenance=false
provenance=false
にしている理由は docker/build-push-action v3.3.0で導入されたprovenanceオプションにまつわる問題 - chroju.dev を参照