使用AWS CodePipeline推送Docker镜像到ECR时提示‘no basic auth credentials’
AWS CodeBuild推送Docker镜像到ECR时报错:no basic auth credentials
问题详情
我使用AWS CodePipeline搭建了从GitHub拉取代码、构建Docker镜像后推送到ECR的流水线。尝试通过aws ecr get-login-password命令完成ECR登录,但在post_build阶段执行docker push时,返回错误提示:no basic auth credentials。
我的buildspec.yml内容如下:
phases: install: runtime-versions: nodejs: 16 pre_build: commands: - echo Installing Dependencies - npm install - docker logout - aws ecr get-login-password || docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com build: commands: - docker build -t $IMAGE_REPO_NAME:$IMAGE_TAG . - docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG post_build: commands: - echo Pushing the docker image - docker -v - aws --version - docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG - printf '[{"name":"%s","imageUrl":"%s"}]' $CONTAINER_NAME $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG > imagedefinitions.json artifacts: files: imagedefinitions.json
报错截图:
解决方案
1. 修正ECR登录命令逻辑
问题出在pre_build阶段的登录命令:你用了||逻辑或运算符,这只会在aws ecr get-login-password执行失败时才运行docker login,但正确的做法是将aws ecr get-login-password的输出通过管道传递给docker login,用来提供登录密码。
修正后的登录命令:
aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com
2. 完整修正后的buildspec.yml
phases: install: runtime-versions: nodejs: 16 pre_build: commands: - echo Installing Dependencies - npm install - docker logout - aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com build: commands: - docker build -t $IMAGE_REPO_NAME:$IMAGE_TAG . - docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG post_build: commands: - echo Pushing the docker image - docker -v - aws --version - docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG - printf '[{"name":"%s","imageUrl":"%s"}]' $CONTAINER_NAME $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG > imagedefinitions.json artifacts: files: imagedefinitions.json
(注:同时修正了printf里的转义引号,避免生成无效的JSON)
3. 额外检查项
- 确认CodeBuild服务角色已授予ECR相关权限:至少包含
ecr:GetAuthorizationToken、ecr:PutImage等推送镜像所需的权限,可直接附加AmazonEC2ContainerRegistryPowerUser托管策略。 - 验证CodeBuild项目中已正确配置
$AWS_ACCOUNT_ID、$AWS_DEFAULT_REGION、$IMAGE_REPO_NAME、$IMAGE_TAG这些环境变量,确保变量值无误。
内容的提问来源于stack exchange,提问作者Batuhan Isildak
相关产品推荐
相关产品推荐

