CodeBuildでECRにPushするときにMulti stageなDockerイメージでキャッシュを効かせる


ベース

以下の記事のような形でCodeBuildを設定している状態

AWS CodeBuildを使ってDockerイメージをビルドし、Amazon EC2 Container Registry(ECR)へpushする | DevelopersIO
https://dev.classmethod.jp/tool/docker/20170225-codebuild-docker/

デフォルトだとキャッシュが効かないのでビルドに時間がかかるのでキャッシュを使うように設定する

解決

Dockerfile内で builder というstageがあるとする

buildspec.yml
version: 0.2

phases:
  install:
    runtime-versions:
      docker: 18
  pre_build:
    commands:
      ## Login ECR
      - $(aws ecr get-login --no-include-email --region $AWS_DEFAULT_REGION)

      ## Dockerイメージのタグとして使用するため、Gitのコミットハッシュを取得
      - IMAGE_TAG=$CODEBUILD_RESOLVED_SOURCE_VERSION
  build:
    commands:
      ## Pullしておく
      - docker pull $IMAGE_REPOSITORY_NAME:builder
      - docker pull $IMAGE_REPOSITORY_NAME:latest
      ## builder stage用
      - >-
        docker build --target builder
        --cache-from $IMAGE_REPOSITORY_NAME:builder
        -t $IMAGE_REPOSITORY_NAME:builder .
      ## Dockerイメージのビルド
      - >-
        docker build
        --cache-from $IMAGE_REPOSITORY_NAME:builder
        --cache-from $IMAGE_REPOSITORY_NAME:latest
        -t $IMAGE_REPOSITORY_NAME:$IMAGE_TAG
        -t $IMAGE_REPOSITORY_NAME:latest .

      ## DockerイメージのECRへのプッシュ
      - docker push $IMAGE_REPOSITORY_NAME:$IMAGE_TAG
      - docker push $IMAGE_REPOSITORY_NAME:latest
      - docker push $IMAGE_REPOSITORY_NAME:builder

      ## ECS+CodeDeployにどのイメージを使用するか指示するためのファイルを作成
      - printf '{"Version":"1.0","ImageURI":"%s"}' $IMAGE_REPOSITORY_NAME:$IMAGE_TAG > imageDetail.json

artifacts:
  ## buildの最後で作成したファイルをアーティファクトとして流す
  files: imageDetail.json

(シンタックスハイライトが>-に対応していない...)

  • docker buildする際に --target を指定して特定のstage用にビルド
  • --cache-from をbuilderステージにも最終stageにもつける

runtime-versions はstandard:2.0ランタイム用の設定
参考: CodeBuildでStandard2.0のイメージを使用したらエラー出たときの対処