初めに
本記事は Fusic Advent Calendar 2020 の18日目の記事です。
紹介する内容
- AWS Codebuild上でdocker pullしすぎるとでるエラを回避する方法を提案します
- AWSのCodeBuildとECRを触った経験ある方は読みやすいと思います
結論
AWS Codebuild上でECRに対してpullしてみてもし、ダメだったらDocker HubからpullしてECRにpushする
-
You have reached your pull rate limit
はdocker pullの回数制限が厳しくなったことが原因です。pull先をECRに変えたら回数制限を気にしなくていいことに注目しました- ECRにimageかあるか? → もしないなら、Docker Hubからpullする → Docker HubからpullされたimageのtagをECRで使う予定のtag名に変更する → ECRで使う予定のtag名に変更できたらimageをECRにpushする
- 最初の一回だけはDocker Hubからpullします
- 二回目からはECRにimageがあるから、Docker Hubからpullしなくてよくなります
紹介始めます
まずはエラ画面です
Codebuildのbuildspec.yamlです
pre_buildフェーズとbuildフェーズが話したい部分です。
version: 0.2
phases:
install:
runtime-versions:
ruby: 2.7
# ECRへのログイン、ECRへのpushとpullに利用する変数定義
pre_build:
commands:
- $(aws ecr get-login --no-include-email --region ${AWS_DEFAULT_REGION})
- AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query 'Account' --output text)
- ECR_REPOSITORY_NAME=nomorelimit
- WEB_URI=${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com/${ECR_REPOSITORY_NAME}
# ECRに欲しいdocker image(ECR_RUBY_URI)がないなら、Docker HubからpullしてECRにpushする
build:
commands:
- ECR_RUBY_URI=$WEB_URI:ruby-2.7.1-slim
- DOCKER_RUBY_URI=ruby:2.7.1-slim
- docker pull $ECR_RUBY_URI || (docker pull $DOCKER_RUBY_URI && docker tag $DOCKER_RUBY_URI $ECR_RUBY_URI && docker push $ECR_RUBY_URI && true)
pre_buildフェーズ詳しく説明
- 1行目:ECRにログインする部分です
- 2行目、3行目:既に作られているECRのリポジトリURIを文字列で組み合わせるために取得しました
- 4行目:既に作られているECRのリポジトリURIを文字列組み合わせ完成させた変数です
buildフェーズ詳しく説明
- 1行目:ECRで使いまわすdocker imageのtag名を含むURIを
ECR_RUBY_URI
にします - 2行目:Docker Hubからpullするdocker imageの原本tag名を含むURIを
DOCKER_RUBY_URI
にします - 3行目:
- ECRからpullを試します
docker pull $ECR_RUBY_URI || …
- もし、ダメだったら、Docker Hubからpullします
|| (docker pull $DOCKER_RUBY_URI …)
- Docker Hubからpullが成功したら、そのdocker imageをECRで使い回す予定だったtag名
$ECR_RUBY_URI
に変えます(… && docker tag $DOCKER_RUBY_URI $ECR_RUBY_URI …)
- ECRで使い回す予定でるtag名
$ECR_RUBY_URI
をECRにpushします(… && docker push $ECR_RUBY_URI && true)
- Docker Hubからpullが成功したら、そのdocker imageをECRで使い回す予定だったtag名
- ECRからpullを試します
Dockerfileへの活用(ボーナス)
ECRのURIをDockerfileのFROMで動的に使えます。
dockerのARGを使って上で話した ECR_RUBY_URI
を渡すことになります。
-
CodeBuild上で実行するコマンド
docker build --build-arg ECR_RUBY_URI=$ECR_RUBY_URI --file ファイルが/ある/パス/Dockerfile .
-
CodeBuildと連携する予定のDockerfileの中身
ARG ECR_RUBY_URI
FROM $ECR_RUBY_URI
# FROM ruby:2.7.1-slim
…