无法将图像推送到Amazon ECR – 以“没有基本身份validation凭据”失败

我正在尝试将Docker镜像推送到Amazon ECRregistry。 我使用docker客户端的Docker版本1.9.1,构builda34a1d5。 我使用“aws ecr get-login –region us-east-1”来获得dockerlogin信誉。 然后,我成功地使用这些信用login如下:

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用户有正确的权限。 我也确保该存储库允许用户推送到它。 只是为了确保这不是一个问题,我设置了registry以允许所有用户完全访问。 没有任何更改“无基本身份validation凭据”错误。 我不知道如何开始debugging,因为所有的stream量都是encryption的。

UPDATE

所以,当我意识到我的问题的根本原因时,我有一点荷马辛普森D'Oh的时刻。 我有权访问多个AWS账户。 即使我正在使用aws configure来为我设置存储库的帐户设置凭据,但aws cli实际上是使用了环境variablesAWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY。 所以当我做了ecr get-login时,它返回了一个错误帐户的login名。 我没注意到账号是不一样的,直到我刚回去尝试一些build议的答案。 当我删除环境variables一切工作正常。 我想这个故事的座右铭是,如果你遇到这个错误,确保你login的资源库与你应用到图像的标签匹配。

如果你运行$(aws ecr get-login --region us-east-1)那么这一切都将为你完成

在我的情况下,这是一个Docker for Windows和他们对Windows Credential Manager的支持。

打开~/.docker/config.json并删除"credsStore": "wincred"条目。

这将导致凭据直接写入config.json 。 之后您将不得不再次login。

您可以通过GitHub上的票#22910和#24968来跟踪这个错误。

如果您使用configuration文件,不要忘记传递–profile = XXX到aws ecr get-login

这应该甚至没有开放的权限。 请参阅文档: 私人registry身份validation 。

[编辑:其实,我做了第二次testing时也有权限问题。 请参阅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 

获取authentication令牌(“docker密码”)。

 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

以交互方式login(将############更改为您的AWS账户ID):

 docker login -u AWS https://############.dkr.ecr.us-east-1.amazonaws.com/ password: <paste the very long password from above> email: <I left this blank> 

推送一个图片(假设你已经做了一个docker镜像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 

我也有这个问题。 发生在我身上的是我忘了运行跑完后返回给我的命令

 aws ecr get-login --region ap-southeast-2 

这个命令返回了一个大的blob,其中包括docker login命令! 我没有意识到。 它应该返回这样的东西:

 docker login -u AWS -p <your_token_which_is_massive> -e none <your_aws_url> 

复制并粘贴这个命令,然后运行你的docker push命令,如下所示:

 docker push 8888888.blah.blah.ap-southwest-1.amazonaws.com/dockerfilename 

如果有帮助的话

我的问题是,我必须使用--profile选项才能从凭证文件中使用正确的configuration文件进行身份validation。

接下来,我已经省略了--region [region_name]命令,这也给了“没有基本authentication凭证”的错误。

对我来说这个解决scheme正在改变我的命令:

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凭证(访问密钥)并使用新凭据重新configurationAWS CLI已解决问题。

之前,“aws ecr get-login –region us-east-1”生成了无效的ECregistryurl的docker login命令。

  1. 确保您先创build了ECRregistry。
    然后根据ECR推送命令说明,剪切并粘贴以下命令
  2. 执行docker login命令(Mac / Linux上的eval跳过剪切和粘贴)
    eval $(aws ecr get-login --region us-east-1)
    如果您使用多个AWS账户,请添加 – configuration文件
    eval $(aws ecr get-login --region us-east-1 --profile your-profile)
  3. docker build -t image-name .
  4. docker tag image-name:latest ############.dkr.ecr.us-east-1.amazonaws.com/image-name:latest
  5. docker push ############.dkr.ecr.us-east-1.amazonaws.com/image-name:latest

如果出现错误,请确保您再次运行所有命令! 您使用aws ecr get-login所获得的凭据是临时的,将会过期。

Windows上的wincred凭证pipe理器中有一个已知的错误。 从生成的login命令中删除“https://”解决了这个问题。

 docker login -u AWS -p <password> <aws_account_id>.dkr.ecr.<region>.amazonaws.com 

代替

 docker login -u AWS -p <password> https://<aws_account_id>.dkr.ecr.<region>.amazonaws.com 

另请参阅故障排除页面 。

AWS文档告诉您执行以下命令(对于ap-southeast-2区域)

 aws ecr get-login --region ap-southeast-2 

当我遇到这个问题的时候,根据这个文档我不清楚你需要把这个命令的结果inputterminal并执行它。

修复了我的工作是将结果复制到剪贴板

 aws ecr get-login --region ap-southeast-2 | pbcopy 

将结果粘贴到命令行并执行

我遇到了这个问题,原因不同:我需要推送到与我的AWS账户(客户端的ECRregistry)无关的registry。 客户端通过添加我的IAM ID(例如, arn:aws:iam::{AWS ACCT #}:user/{Username} )作为主体,授予我在“registry的权限”选项卡下的访问权限。 我试图用通常的步骤login:

 $(aws ecr get-login --region us-west-2 --profile profilename) docker push {Client AWS ACCT #}.dkr.ecr.us-west-1.amazonaws.com/imagename:latest 

这当然导致no basic auth credentials 。 事实certificate , aws ecr get-login会将您aws ecr get-loginregistry的ECR中, 以便与您的login名相关联 ,这在回顾过程中很有意义。 解决方法是告诉aws ecr get-login你想aws ecr get-login哪个registry。

 $(aws ecr get-login --region us-west-2 --profile profilename --registry-ids {Client AWS ACCT #}) 

之后, docker push工作就好了。

试试:

 eval $(aws ecr get-login --no-include-email | sed 's|https://||') 

推之前。

我们今天也遇到这个问题,并尝试在这篇文章中提到的一切(除了生成AWS凭证)。

我们最终通过简单地升级Docker来解决问题,然后推送工作。

Docker 1.10.x遇到了这个问题,并用Docker 1.11.x解决了。

希望这可以帮助

我遇到了这个问题,以及在OSX上运行。 我看到了奥利弗·萨尔茨堡的回应,并检查了我的〜/ .docker / config.json。 它拥有来自我拥有的不同AWS账户的多个授权凭证。 我删除了该文件,运行get-login后,它再次运行。

如果为了CI / CD目的而隔离AWS账户,并且在多个AWS账户之间共享一个ECR存储库,则可能需要手动更改~/.docker/config.json

假设你有这些设置:

  1. ECR拥有AWS账户ID 00000000000000
  2. CI服务器归AWS账户ID 99999999999999

如果你打电话给aws ecr get-login --region us-west-2 | bash aws ecr get-login --region us-west-2 | bash在你的CI服务器中, ~/.docker/config.json将在~/.docker/config.json生成临时凭证。

 { "auths": { "https://99999999999999.dkr.ecr.us-west-2.amazonaws.com": { "auth": "long-token.." } } } 

但是你想指向ECR的账户,所以你需要改变主机名。

 { "auths": { "https://00000000000000.dkr.ecr.us-west-2.amazonaws.com": { "auth": "long-token.." } } } 

请注意,这种情况依赖于您如何形成IAM用户/策略以允许ECR访问。

您必须确保您使用正确的凭据login,请参阅官方错误说明并在此处查看

http://docs.aws.amazon.com/AmazonECR/latest/userguide/common-errors-docker.html

修复“没有基本authentication”的链接描述

我面临同样的问题,我犯的错误是使用错误的回购path

例如: docker push xxxxxxxxxxxxxx.dkr.ecr.us-east-1.amazonaws.com/jenkins:latest

在上面的path中,这是我犯了错误的地方:在"dkr.ecr.us-east-1.amazonaws.com"而不是"west" 。 我正在使用“ east" 。 一旦我纠正了我的错误,我能够成功地推送图像。

确保您在aws ecr get-login使用了正确的区域,它必须与您的存储库创build的区域相匹配。

 aws ecr get-login --region us-west-1 --no-include-email 

这个命令给我正确的命令login。 如果你不使用“–no-include-email”,它会抛出另一个错误。 上述命令的输出看起来像这个dockerlogin-u AWS -p **********************非常大的******。 复制并执行它。 现在将显示“login成功”。 现在,您可以将图像推送到ECR。

确保您的AMI规则具有您尝试login的用户的权限。

只要运行任何返回的步骤一将解决问题。