AWS Elastic Beanstalk - 使用 ECR 时,/root/.docker/config.json 未使用新凭证更新
Posted
技术标签:
【中文标题】AWS Elastic Beanstalk - 使用 ECR 时,/root/.docker/config.json 未使用新凭证更新【英文标题】:AWS Elastic Beanstalk - /root/.docker/config.json not updated with new credentials when ECR has been used 【发布时间】:2020-03-15 01:55:30 【问题描述】:我目前正在从 ECR 切换到 GitHub 包来托管我们的 docker 图像。经过大量的试验和错误,以及在拉取图像时收到很多消息,如no basic auth credentials
,我开始通过 SSH:ing 深入挖掘 beanstalk 实例以调查实际文件。事实证明,当我使用新凭据更新 S3 存储桶中的 .dockercfg 时,这些凭据会按预期复制到 beanstalk 上的 /root/.dockercfg
,但不会反映在 /root/.docker/config.json
中。此文件仅包含 ECR 凭据,而不包含 GitHub 凭据。如果我手动添加 GitHub 凭据,我可以很好地提取图像。 /root/.docker/config.json
似乎覆盖了 /root/.dockercfg
中的凭据,这些凭据仅在部署期间存在。
我该如何解决这个问题?
编辑:
根本原因似乎是 /root/.docker/config.json
是在使用 ECR 时创建的,并且不会由其他私有注册表身份验证更新,因为 ECR 被视为不同。当我设置一个从一开始就使用 GitHub 的新 beanstalk 时,一切都按预期工作。这部分/opt/elasticbeanstalk/hooks/pre/03build.sh
创建文件:
# if the image is in an ECR repo, authenticate with ECR
ECR_IMAGE_PATTERN="^([a-zA-Z0-9][a-zA-Z0-9_-]*)\\.dkr\\.ecr\\.([a-zA-Z0-9][a-zA-Z0-9_-]*)\\.amazonaws\\.com(\\.cn)?/.*"
if [[ $FROM_IMAGE =~ $ECR_IMAGE_PATTERN ]]; then
ECR_REGISTRY_ID=$BASH_REMATCH[1]
ECR_REGION=$BASH_REMATCH[2]
ECR_LOGIN_RESPONSE=`aws ecr get-login --no-include-email --registry-ids $ECR_REGISTRY_ID --region $ECR_REGION 2>&1`
[ $? -eq 0 ] || error_exit "Failed to authenticate with ECR for registry '$ECR_REGISTRY_ID' in '$ECR_REGION'" 1
# output of aws ecr get-login should be a "docker login" command, simply invoke it
echo $ECR_LOGIN_RESPONSE | grep -q "^docker login" || error_exit "Invalid response from 'aws ecr get-login', expecting a 'docker login' command, was: '$ECR_LOGIN_RESPONSE'."
eval $ECR_LOGIN_RESPONSE
fi
【问题讨论】:
【参考方案1】:解决方法是删除/root/.docker/config.json
或启用不可变部署以便创建新的 EC2 实例。
【讨论】:
以上是关于AWS Elastic Beanstalk - 使用 ECR 时,/root/.docker/config.json 未使用新凭证更新的主要内容,如果未能解决你的问题,请参考以下文章
AWS Elastic Beanstalk 与 AMI2 和 docker-compose.yml
Amazon Elastic BeanStalk 错误:无法创建 AWS Elastic Beanstalk 应用程序版本