我正在尝试将docker镜像推送到Amazon ECR注册表.我正在使用docker客户端Docker版本1.9.1,构建a34a1d5.我使用"aws ecr get-login --region us-east-1"来获取docker登录信息.然后,我成功登录这些信用如下:
docker login -u AWS -p XXXX -e none https://####.dkr.ecr.us-east-1.amazonaws.com WARNING: login credentials saved in /Users/ar/.docker/config.json Login Succeeded
但是当我尝试推送我的图像时,我收到以下错误:
$ docker push ####.dkr.ecr.us-east-1.amazonaws.com/image:latest The push refers to a repository [####.dkr.ecr.us-east-1.amazonaws.com/image] (len: 1) bcff5e7e3c7c: Preparing Post https://####.dkr.ecr.us-east-1.amazonaws.com/v2/image/blobs/uploads/: no basic auth credentials
我确保aws用户拥有正确的权限.我还确保存储库允许该用户推送它.为了确保这不是问题,我将注册表设置为允许所有用户完全访问.没有任何更改"无基本身份验证凭据"错误.由于所有流量都已加密,我不知道如何开始调试.
UPDATE
所以当我意识到问题的根本原因时,我有一点荷马辛普森D'哦.我可以访问多个AWS账户.即使我使用aws configure为我设置存储库的帐户设置我的凭据,但aws cli实际上使用的是环境变量AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY.因此,当我执行aws ecr get-login时,它返回了错误帐户的登录信息.我没注意到帐号是不同的,直到我现在回去尝试一些建议的答案.当我删除环境变量时,一切正常.我想故事的座右铭是,如果您遇到此错误,请确保您登录的存储库与您应用于图像的标记相匹配.
如果你运行$(aws ecr get-login --region us-east-1)
它将全部为你完成
在我的例子中,这是Docker for Windows的一个错误,它们支持Windows Credential Manager.
打开~/.docker/config.json
并删除"credsStore": "wincred"
条目.
这将导致凭证config.json
直接写入.之后你必须再次登录.
您可以通过GitHub上的#22910和#24968门票跟踪此错误.
如果您使用配置文件,请不要忘记传递--profile=XXX
给aws ecr get-login
.
我也有这个问题.发生在我身上的事情是我忘记运行我跑完后返回给我的命令
aws ecr get-login --region ap-southeast-2
这个命令返回了一个大blob,其中包含docker login
命令!我没有意识到.它应该返回这样的东西:
docker login -u AWS -p-e none
复制并粘贴此命令,然后运行docker push命令,如下所示:
docker push 8888888.blah.blah.ap-southwest-1.amazonaws.com/dockerfilename
即使没有打开权限,这应该可以工作.请参阅文档:私有注册表身份验证.
[编辑:实际上,在进行第二次测试时我也有权限问题.请参阅Docker推送到AWS ECR私有仓库失败并出现格式错误的JSON.)
不过我遇到了同样的问题; 我不知道为什么,但是我成功地使用了文档中描述的更加冗长的auth机制来获取授权令牌
AWS CLI和Docker版本:
$ aws --version aws-cli/1.9.17 Python/2.7.6 Linux/3.16.0-38-generic botocore/1.3.17 $ docker --version Docker version 1.9.1, build a34a1d5
获取身份验证令牌('docker password').
aws ecr get-authorization-token --region us-east-1 --output text \ --query authorizationData[].authorizationToken | base64 -d | cut -d: -f2
注意:我的〜/ .aws/config指定了一个不同的默认区域,所以我需要明确设置--region us-east-1
.
以交互方式登录(更改############
为您的AWS账户ID):
docker login -u AWS https://############.dkr.ecr.us-east-1.amazonaws.com/ password:email:
推送图像(假设您已制作泊坞窗图像test
):
docker tag test:latest ############.dkr.ecr.us-east-1.amazonaws.com/test:latest docker push ############.dkr.ecr.us-east-1.amazonaws.com/test:latest The push refers to a repository [910732017890.dkr.ecr.us-east-1.amazonaws.com/test] (len: 1) d5122f58a2e1: Pushed 7bddbca3b908: Pushed latest: digest: sha256:bc0b521fd398bd1a2ef58a289dcb910334608723fd570e7bddb36eacd0060363 size: 4378
试试:
eval $(aws ecr get-login --no-include-email | sed 's|https://||')
在推之前.
如果有帮助的话...
我的问题是我必须使用该--profile
选项才能使用凭证文件中的正确配置文件进行身份验证.
接下来,我已经省略了该--region [region_name]
命令,该命令还给出了"无基本身份验证凭据"错误.
我的解决方案是改变我的命令:
aws ecr get-login
对此:
aws --profile [profile_name] ecr get-login --region [region_name]
例:
aws --profile foo ecr get-login --region us-east-1
希望有人帮助!
我遇到了同样的问题.
生成新的AWS凭据(访问密钥)并使用新凭据重新配置AWS CLI解决了该问题.
之前,aws ecr get-login --region us-east-1
生成的docker login命令包含无效的EC注册表URL.
Windows上的wincred凭证管理器中存在一个已知错误.从生成的登录命令中删除"https://"解决了这个问题.
docker login -u AWS -p.dkr.ecr. .amazonaws.com
代替
docker login -u AWS -phttps:// .dkr.ecr. .amazonaws.com
另请参阅故障排除页面.
确保首先创建了ECR注册表.
然后根据ECR推送命令指令,剪切并粘贴以下命令
eval $(aws ecr get-login --region us-east-1)
如果您使用多个AWS账户,执行docker login命令(在Mac/Linux上的eval跳过剪切和粘贴)add --profile
eval $(aws ecr get-login --region us-east-1 --profile your-profile)
docker build -t image-name .
docker tag image-name:latest ############.dkr.ecr.us-east-1.amazonaws.com/image-name:latest
docker push ############.dkr.ecr.us-east-1.amazonaws.com/image-name:latest
如果出现错误,请确保再次运行所有命令!您使用的凭据aws ecr get-login
是临时的,将过期.
在我的情况下,运行后aws ecr get-login --no-include-email --region *****
,我只复制了格式为的命令输出docker login -u *** -p ************
,然后将其粘贴到提示中。继续推进。