我目前正在从 ECR 切换到 GitHub 包来托管我们的 docker 图像。经过大量的试验和错误以及no basic auth credentials
拉取图像时的大量消息后,我开始通过 SSH:ing 深入挖掘 beanstalk 实例以调查实际文件。事实证明,当我使用新凭据更新 S3 存储桶中的 .dockercfg 时,这些凭据会按预期复制到/root/.dockercfg
beanstalk 上,但不会反映在/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