AWS Elastic Beanstalk - /root/.docker/config.json 在使用 ECR 时未使用新凭证更新
AWS Elastic Beanstalk - /root/.docker/config.json not updated with new credentials when ECR has been used
我目前正在从 ECR 切换到 GitHub 包来托管我们的 docker 图像。经过大量的试验和错误,以及在拉取图像时出现很多类似 no basic auth credentials
的消息,我开始通过 SSH:ing 深入挖掘 beantalk 实例以调查实际文件。事实证明,当我使用新凭证更新我的 S3 存储桶中的 .dockercfg 时,这些凭证会按预期复制到 beantalk 上的 /root/.dockercfg
,但不会反映在 /root/.docker/config.json
中。此文件仅包含 ECR 凭据,不包含 GitHub 凭据。如果我手动添加 GitHub 凭据,我可以很好地提取图像。似乎 /root/.docker/config.json
覆盖了 /root/.dockercfg
中的凭据,这些凭据仅在部署期间存在。
我该如何解决这个问题?
编辑:
根本原因似乎是 /root/.docker/config.json
是在使用 ECR 时创建的,并且不会被其他私有注册中心身份验证更新,因为 ECR 的处理方式不同。当我设置一个从一开始就使用 GitHub 的新 beantalk 时,一切都按预期进行。 /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
解决方法是删除 /root/.docker/config.json
或启用不可变部署,以便创建新的 EC2 实例。
我目前正在从 ECR 切换到 GitHub 包来托管我们的 docker 图像。经过大量的试验和错误,以及在拉取图像时出现很多类似 no basic auth credentials
的消息,我开始通过 SSH:ing 深入挖掘 beantalk 实例以调查实际文件。事实证明,当我使用新凭证更新我的 S3 存储桶中的 .dockercfg 时,这些凭证会按预期复制到 beantalk 上的 /root/.dockercfg
,但不会反映在 /root/.docker/config.json
中。此文件仅包含 ECR 凭据,不包含 GitHub 凭据。如果我手动添加 GitHub 凭据,我可以很好地提取图像。似乎 /root/.docker/config.json
覆盖了 /root/.dockercfg
中的凭据,这些凭据仅在部署期间存在。
我该如何解决这个问题?
编辑:
根本原因似乎是 /root/.docker/config.json
是在使用 ECR 时创建的,并且不会被其他私有注册中心身份验证更新,因为 ECR 的处理方式不同。当我设置一个从一开始就使用 GitHub 的新 beantalk 时,一切都按预期进行。 /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
解决方法是删除 /root/.docker/config.json
或启用不可变部署,以便创建新的 EC2 实例。