ECRにCodeBuildからimageをpush

やったこと

  • CodeBuildでdocker imageをbuildして、ECR repositoryへpush

先にまとめ

  • つまずきポイント2点
    • CodeBuildでdockerを使う場合は PrivilegedのチェックをONに
    • CodeBuild実行中docker pullのrequest上限に達してBuildエラー

buildspec.ymlの処理内容

version: 0.2

phases:
  install:
    runtime-versions:
      python: 3.9
    commands:
      - export AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query 'Account' --output text)
  build:
    commands:
      - docker build -t otakashi-test-image .
  post_build:
    commands:
      - aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin xxxxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com
      - docker tag otakashi-test-image:latest xxxxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/otakashi-test-repository:latest
      - docker push xxxxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/otakashi-test-repository:latest
      - sls deploy --stage $STAGE

buildspec.ymlの処理内容を先に置いておきます
docker buildを実行して、その後docker pushしています
まだrepositoryが存在していない場合はエラーになるはずなのでCloudFormationでECRのrepositoryを作りましょう
buildspecからCloudFormationのビルドを行う場合は、このエラーを回避するため初回のみdocker pushの記述をコメントアウトする必要があります(CFnのビルド成功後、コメントアウトを解除してdocker pushを実行させる)

CloudFormationの実装内容

Resources:
  ECRRepository:
    Type: AWS::ECR::Repository
    Properties:
      RepositoryName: otakashi-test-repository

想像してたよりシンプル…

つまずきポイント

CodeBuildでdockerを使う場合は PrivilegedのチェックをONに

CodeBuildのPrivileged設定をOFFのままでdocker buildを実行する際エラーが発生しました

[Container] 2023/03/23 09:15:19 Running command docker build -t codebuild-test .
    Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

CodeBuildでdocker imageをbuildする場合(dockerを扱う場合は)CodeBuild作成時にPrivilegedの設定をONにしましょう

CodeBuild実行中docker pullのrequest上限に達してBuildエラー

CodeBuild実行時に下記のエラーが発生しました

toomanyrequests: You have reached your pull rate limit. You may increase the limit by authenticating and upgrading: https://www.docker.com/increase-rate-limit

原因

  • 東京regionに存在する8つのCodeBuildが存在し、いずれかのIPが付与されたCodeBuildを使っている
  • 運が悪ければ100pull の上限に達しているIPのCodeBuildで実行されてこのエラーが発生する

対策としては、

CodeBuildガチャなので再度実行する(今回はこっちで乗り越えた)

本当はdocker hubのアカウントを作成し、CodeBuildからdocker hubへログインする処理を加えるのが真っ当な策