执行AWS CodeBuild的build.yml时遇Docker登录403错误求助
执行AWS CodeBuild的build.yml时触发Docker登录失败,错误信息如下:
Error response from daemon: login attempt to ***/v2/ failed with status: 403 Forbidden
[Container] 2024/08/03 09:13:53.450561 Command did not exit successfully echo "$DOCKER_REGISTRY_PASSWORD" | docker login -u "$DOCKER_REGISTRY_USERNAME" --password-stdin "$DOCKER_REGISTRY_URL" exit status 1
[Container] 2024/08/03 09:13:53.453890 Phase complete: BUILD State: FAILED
[Container] 2024/08/03 09:13:53.453909 Phase context status code: COMMAND_EXECUTION_ERROR Message: Error while executing command: echo "$DOCKER_REGISTRY_PASSWORD" | docker login -u "$DOCKER_REGISTRY_USERNAME" --password-stdin "$DOCKER_REGISTRY_URL". Reason: exit status 1
已检查Docker凭证和build.yml语法,未发现问题,需解决该故障。
- 验证CodeBuild服务角色权限:确保CodeBuild使用的服务角色拥有访问目标Docker Registry的权限。如果是AWS ECR,需附加
AmazonEC2ContainerRegistryPowerUser或自定义权限策略,包含ecr:GetAuthorizationToken、ecr:BatchCheckLayerAvailability、ecr:GetDownloadUrlForLayer、ecr:BatchGetImage、ecr:InitiateLayerUpload、ecr:UploadLayerPart、ecr:CompleteLayerUpload、ecr:PutImage这些必要权限。 - 检查凭证传递有效性:确认CodeBuild环境变量
DOCKER_REGISTRY_USERNAME和DOCKER_REGISTRY_PASSWORD已正确配置为安全变量,避免明文泄露。可在build.yml中添加临时调试步骤,输出变量长度(而非明文)验证传递状态:echo "Username length: ${#DOCKER_REGISTRY_USERNAME}" echo "Password length: ${#DOCKER_REGISTRY_PASSWORD}" - 核对Registry URL格式:如果是AWS ECR,Registry URL应为
123456789012.dkr.ecr.region.amazonaws.com格式,确保无多余后缀(如/v2/),也不要遗漏区域信息。 - 检查Registry访问策略:私有Registry需确认访问策略允许CodeBuild服务角色或凭证对应账号执行登录、推送/拉取操作。比如ECR的资源策略需明确授权对应主体。
- 验证凭证时效性:部分Registry的凭证(如ECR临时token)有有效期,若使用手动生成的token,确认未过期;自动获取的凭证需检查生成逻辑是否正常。
- 本地登录测试:在本地环境使用相同凭证和Registry URL执行
docker login命令,验证是否能成功登录,排除Registry本身的故障。
内容的提问来源于stack exchange,提问作者CHIRAG SHARMA

