0

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

1 回答 1

0

一种解决方法是删除/root/.docker/config.json或启用不可变部署,以便创建新的 EC2 实例。

于 2019-11-25T13:27:31.410 回答