无法将图像推送到Amazon ECR - 无法使用“无基本身份验证凭据”

问题描述 投票:126回答:31

我正在尝试将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时,它返回了错误帐户的登录信息。我没注意到帐号是不同的,直到我现在回去尝试一些建议的答案。当我删除环境变量时,一切正常。我想故事的座右铭是,如果您遇到此错误,请确保您登录的存储库与您应用于图像的标记相匹配。

amazon-web-services docker
31个回答
85
投票

如果你运行$(aws ecr get-login --region us-east-1)它将全部为你完成


5
投票
  1. 确保首先创建了ECR注册表。 然后根据ECR推送命令指令,剪切并粘贴以下命令
  2. 执行docker login命令(Mac / Linux上的eval跳过剪切和粘贴) eval $(aws ecr get-login --region us-east-1) 如果您使用多个AWS账户,请添加--profile 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获得的凭据是临时的,将过期。


5
投票

在我的例子中,在运行aws ecr get-login --no-include-email --region *****后,我只是复制了该命令的输出,格式为docker login -u *** -p ************,然后将其粘贴到提示符中。推进了。


4
投票

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

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

当我遇到这个问题时,基于那些文档我不清楚你需要将这个命令的结果输入终端并执行它。

修复对我有用的是将结果复制到剪贴板

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

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


3
投票

我遇到这个问题的原因不同:我需要推送到与我的AWS账户无关的注册管理机构(客户的ECR注册管理机构)。客户端通过添加我的IAM ID(例如,arn:aws:iam::{AWS ACCT #}:user/{Username})作为委托人,在注册表的权限选项卡下授予我访问权限。我尝试使用通常的步骤登录:

$(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 credentialsAs it turns outaws ecr get-login将您登录到与登录相关联的注册表的ECR,这在回顾中是有意义的。解决方案是告诉aws ecr get-login您要登录的注册表。

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

在那之后,docker push工作得很好。


3
投票

运行此命令后:

(aws ecr get-login --no-include-email --region us-west-2)

只需从输出中运行docker login命令

docker login -u AWS -p epJ....

是docker登录ECR的方式


1
投票

我遇到了这个问题以及在OSX上运行。我看到了Oliver Salzburg的回复并检查了我的〜/ .docker / config.json。它拥有来自我所拥有的不同AWS账户的多个授权凭证。我删除了该文件,再次运行get-login后就可以了。


1
投票

我遇到了同样的问题,我所犯的错误是使用错误的回购路径

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

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


1
投票

我的问题是拥有多个AWS凭证;默认和开发。因为我试图部署到开发这个工作:

$(aws ecr get-login --no-include-email --region eu-west-1 --profile dev | sed 's|https://||')

1
投票

FWIW,Debian 9,Docker版本18.06.1-ce,build e68fc7a:

$(aws ecr get-login | sed 's| -e none | |g')


1
投票

如果您使用多个配置文件,并且需要登录到非默认配置文件,则需要使用以下命令登录:

$(AWS_PROFILE=<YOUR PROFILE> aws ecr get-login --no-include-email --region eu-west-1)

53
投票

在我的例子中,这是Docker for Windows的一个错误,它们支持Windows Credential Manager。

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

这将导致凭证直接写入config.json。之后你必须再次登录。

你可以通过GitHub上的门票#22910#24968来追踪这个bug。


1
投票

在PowerShell中的Windows上,使用:

Invoke-Expression $(aws ecr get-login --no-include-email)

1
投票

aws-cli给出的docker命令很少......

使用docker login时,docker会在你的keychain或〜/ .docker / config.json文件中保存一个服务器:密钥对

如果它在https://7272727.dkr.ecr.us-east-1.amazonaws.com下保存密钥,则在推送期间查找密钥将失败,因为docker将查找名为7272727.dkr.ecr.us-east-1.amazonaws.com而不是https://7272727.dkr.ecr.us-east-1.amazonaws.com的服务器。

使用以下命令登录:

eval $(aws ecr get-login --no-include-email --region us-east-1 --profile yourprofile | sed 's|https://||')

一旦你运行命令,你将获得'Login Succeeded'消息,然后你很好 之后你的推送命令应该工作


1
投票

以下命令对我有用:

sudo $(aws ecr get-login --region us-east-1 --no-include-email)

然后我运行这些命令:

sudo docker tag e9ae3c220b23(image_id) aws_account_id.dkr.ecr.region.amazonaws.com/my-web-app

sudo docker push aws_account_id.dkr.ecr.region.amazonaws.com/my-web-app

0
投票

我们今天也遇到了这个问题并尝试了本文中提到的所有内容(生成AWS凭证除外)。

我们最终通过简单地升级Docker解决了这个问题,然后推动了工作。

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

希望这可以帮助


0
投票

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

假设你有这些设置:

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

如果您在CI服务器中调用aws ecr get-login --region us-west-2 | bash,docker将在~/.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访问。


0
投票

您必须确保使用正确的凭据登录,请参阅官方错误说明并在此处进行检查

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

链接中描述了修复“无基本身份验证”


0
投票

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


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

此命令为我提供了正确的登录命令。如果你不使用“--no-include-email”,它将引发另一个错误。上面命令的输出看起来像这个docker登录-u AWS -p **********************非常大的******。复制并执行它。现在它将显示“Login Succeeded”。现在您可以将图像推送到ECR。

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


0
投票

只需运行第一步中返回的任何内容即可解决问题。


0
投票

该错误消息来自docker,它不一定与AWS有关,因为我在不使用AWS时遇到了同样的错误...它只是说docker没有获得授权从任何来源的auth进行处理它碰巧正在使用

在我的情况下,在测试中我删除了目录〜/ .docker并得到了该错误...在我弹回我的本地docker注册表然后docker push很好


38
投票

如果您使用配置文件,请不要忘记将--profile=XXX传递给aws ecr get-login


0
投票

在我的情况下(可能在所有情况下),此错误是由于拥有多个AWS账户造成的。因此,AWS ECR未使用与aws帐户相关的正确aws凭据。

我试过这里提到的多个解决方案,但没有成功。它在使用令牌而不是用户名和密码后起作用。我按照这里的说明工作了。 https://btburnett.com/2017/01/docker-login-for-amazon-aws-ecr-using-windows-powershell.html


22
投票

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

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

14
投票

即使没有打开权限,这应该可以工作。请参阅文档:Private Registry Authentication

[编辑:实际上,在进行第二次测试时我也有权限问题。见Docker push to AWS ECR private repo failing with malformed JSON)。]

不过我遇到了同样的问题;我不知道为什么,但我成功地使用了get-authorization-token文档中描述的更长篇的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: <paste the very long password from above>
email: <I left this blank>

推图像(假设您已制作码头图像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

12
投票

试试:

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

在推之前。


11
投票

如果有帮助的话...

我的问题是我必须使用--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

希望有人帮助!


8
投票

Windows上的wincred凭证管理器中存在一个已知错误。从生成的登录命令中删除“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

另见the troubleshooting page


8
投票

我遇到了同样的问题。

生成新的AWS凭据(访问密钥)并使用新凭据重新配置AWS CLI解决了该问题。

之前,aws ecr get-login --region us-east-1生成了具有无效EC注册URL的docker login命令。

© www.soinside.com 2019 - 2024. All rights reserved.