推送Docker镜像至AWS ECR时遇denied: Not Authorized错误如何解决?
解决AWS ECR镜像推送的权限与认证错误
针对 denied: Not Authorized 错误的排查步骤
- 核对IAM用户的权限关联:确保你配置的那几个权限策略(比如AmazonEC2ContainerRegistryFullAccess)确实直接附加到了该IAM用户,而非仅存在于用户组但用户未加入对应组。
- 检查AWS CLI配置的正确性:执行
aws configure list查看当前使用的AWS账号ID、区域是否和你的ECR仓库一致。如果用了多profile,要确保操作时指定了正确的profile(比如加--profile <你的profile名>)。 - 验证ECR仓库的资源策略:登录AWS控制台进入对应ECR仓库,查看「权限」标签下的资源策略,确认策略中允许该IAM用户执行
ecr:InitiateLayerUpload、ecr:UploadLayerPart、ecr:CompleteLayerUpload、ecr:PutImage这些推送必需的操作。 - 确认镜像标签格式:镜像必须打正确的ECR仓库标签,格式为
[AWS账号ID].dkr.ecr.[区域].amazonaws.com/[仓库名]:[版本标签],标签错误会直接触发权限拒接。
针对 no basic auth credentials 错误的解决方法
这个错误是Docker没有拿到ECR的认证凭据,必须用AWS CLI生成并传递给Docker:
- 先确保AWS CLI已经正确配置(执行
aws configure输入正确的access key、secret key、区域)。 - 执行以下命令完成Docker登录ECR:
aws ecr get-login-password --region <你的ECR区域> | docker login --username AWS --password-stdin <你的AWS账号ID>.dkr.ecr.<你的ECR区域>.amazonaws.com - 如果使用多AWS profile,需要在命令中指定profile:
aws ecr get-login-password --region us-east-1 --profile my-custom-profile | docker login --username AWS --password-stdin 123456789012.dkr.ecr.us-east-1.amazonaws.com注意:不要使用旧版的
aws ecr get-login命令,该命令已被官方弃用,会导致认证失败。
通用验证步骤
- 先测试IAM用户是否能访问ECR仓库:执行
aws ecr describe-repositories --repository-names <你的仓库名>,如果能返回仓库信息,说明权限配置没问题;如果报错,优先排查IAM权限或账号配置。 - 检查Docker运行环境:如果用了WSL2、远程Docker主机等非本地默认环境,需要在对应环境中执行AWS CLI配置和Docker登录命令,确保认证信息同步到该环境的Docker中。
- 排查MFA限制:如果你的IAM用户启用了MFA,需要生成带MFA的临时凭证(通过
aws sts get-session-token命令),并将临时凭证配置到AWS CLI中,否则无法完成认证。
内容的提问来源于stack exchange,提问作者Ivan Correa
相关产品推荐
相关产品推荐

