无法将图像推送到Amazon ECR-失败,并显示“没有基本身份验证凭证”


172

我正在尝试将Docker映像推送到Amazon ECR注册表。我正在使用Docker客户端Docker 1.9.1版本build 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用户具有正确的权限。我还确保存储库允许该用户推送到该存储库。为了确保这不是问题,我将注册表设置为允许所有用户完全访问。没有任何改变"no basic auth credentials"错误。由于所有流量均已加密,因此我不知道如何开始调试它。

更新

因此,当我意识到问题的根本原因时,我感到有点荷马·辛普森·德奥。我可以访问多个AWS账户。即使我正在使用aws configure设置存储库的帐户设置凭据,aws cli实际上仍在使用环境变量AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY。因此,当我这样做时,aws ecr get-login它将返回错误帐户的登录名。我没有注意到帐号是不同的,直到我现在返回尝试一些建议的答案。当我删除环境变量时,一切正常。我想这个故事的座右铭是,如果您遇到此错误,请确保您登录的存储库与您已应用于图像的标记匹配。


10
您应该将其更新为粗体,加下划线和斜体。我也有荷马·辛普森那一刻。谢谢!
迈克,

感谢您缩小范围!你从字面上保存了我的一天!
simonso '16

2
如果存储库不存在,则会出现相同的错误。检查是否在正确的区域中创建了仓库。
伊利亚·西多连科


请注意,您可以设置您的AWS CLI来处理多用户配置文件:docs.aws.amazon.com/cli/latest/userguide/...
彼得·伯格

Answers:


111

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


17
你真是传奇 除第2步外,AWS指南共包含5个步骤,所有步骤都带有shell命令,其中仅说“运行在上一步中返回的docker login命令”。我猜的人喜欢自己一整堆只专注于shell命令并没有正确读取指令
田亭

Time Machine-为什么将aws命令包装在$()中会导致登录成功?
VtoCorleone

6
@VtoCorleone因为aws命令只是将docker命令打印到标准输出。如果将该字符串包装在$()中,它将由外壳程序解释并docker login运行该命令。
Otavio Macedo

2
$(aws ecr get-login --region us-west-2)未知速记标志:-e中的“ e”,请参阅“ docker login --help”。
Ashish Karpe

23
如果您收到“未知速记标志:'e'”,则必须使用--no-include-email标志运行命令,如下所示:$(aws ecr get-login --region us-east-1-不包括电子邮件)
特伦顿

57

就我而言,这是Docker for Windows及其对Windows Credential Manager的支持中的错误。

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

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

您可以通过GitHub上的票证#22910#24968跟踪此错误。


谢谢-在Windows 10上工作。在从config中删除该属性后,再次运行docker login命令,使用凭据更新了配置文件,并进行了推送。
卡梅伦

我找不到配置文件。您能建议我config.json文件的位置吗?
Ramashanker Tripathi

@RamashankerTripathi该位置在答案中。我不确定该如何清除。
Der Hochstapler '16

@OliverSalzburg感谢您的答复。实际上,我的Docker安装目录不包含config.json文件。
Ramashanker Tripathi

@RamashankerTripathi ~/.docker手段.docker在你的home目录。试试%HOMEDRIVE%%HOMEPATH%\.docker
Der Hochstapler,2016年

50

如果您使用个人资料,请不要忘记传递--profile=XXXaws ecr get-login


27

我也有这个问题。我发生了什么事,我忘了运行我运行后返回给我的命令

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

1
我不知道那个Blob响应是什么,所以我忽略了它。哈哈。感谢您指出了这一点!
duyn9uyen '18

14

即使没有打开权限,它也应该起作用。请参阅文档:专用注册表身份验证

[编辑:实际上,在进行第二次测试时,我也遇到权限问题。请参阅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

获取身份验证令牌(“泊坞窗密码”)。

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>

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

您如何粘贴很长的密码???我的是几行。我正在使用Windows Docker快速入门终端,该终端似乎没有良好的复制/粘贴功能,或者也许我无法弄清楚。
大卫,

令其他人感到疑惑的是,我只需要标记并复制整个内容(包括空格),然后将其粘贴到记事本中即可。从那里,我删除了换行符,并且重新复制一切,只有那么我可以粘贴到终端的命令行。那行得通。
大卫,

如果您使用的是PowerShell,请转到“属性”>“选项”选项卡,然后选择“启用换行选择”。这样,您可以单击并拖动来选择换行,而不必手动复制到记事本中,删除新线等
adarshr

我已经有10年没有接触过Windows机器了,但是您始终可以通过管道将stdout传送到文件:aws ecr get-authorization-token > config.json然后在您喜欢的文本编辑器中将其打开以
随意

13

尝试:

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

在推之前。


我明白了no basic auth credentials Invalid IPv6 URL
Thanh Nguyen Van

12

更新资料

由于aws ecr get-login不推荐使用AWS CLI版本2 ,因此正确的方法是aws ecr get-login-password

因此,正确的和更新的答案如下: docker login -u AWS -p $(aws ecr get-login-password --region us-east-1) xxxxxxxx.dkr.ecr.us-east-1.amazonaws.com


我得到unknown flag: --region
kittu

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

希望能帮助到某人!


1
你救了我!我像这样使用我的aws配置文件,AWS_PROFILE=myprofile aws ecr get-login它没有用,但是引入带有--profile参数的aws配置文件可以解决问题!
Colo Ghidini

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

另请参阅故障排除页面


8

我遇到了同样的问题。

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

先前,aws ecr get-login --region us-east-1使用无效的EC注册表URL生成的docker login命令。


我也一样 谢谢!
Greendrake '16

这是我的问题。我在〜/ .aws / credentials中存储了与我管理的aws不同的AWS CLI凭据。重新创建了新的凭据和有效的设置。
Martin Algesten

5

我遇到此问题的原因不同:我需要推送到与我的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 credentials事实证明aws 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就可以了。


这是有道理的。但是您应该传递什么--profile?我有一个个人帐户,但我正尝试使用公司帐户。换句话说,我在哪里找到profilename
CiprianTomoiagă19年

1
@CiprianTomoiagă仅在使用命名配置文件时才应包括在内。看到这里docs.aws.amazon.com/cli/latest/userguide/…–
塞尔吉奥

5
  1. 确保首先创建了ECR注册表。
    然后按照ECR推送命令说明,剪切并粘贴以下命令

  2. 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)
  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是临时的,并且将过期。


我在哪里可以找到什么your-profile
安迪

如果您使用的是默认配置文件,则可以忽略它
Jason

我试图弄清楚如何不使用默认配置文件。我发现,可以在~/.aws/config~/.aws/credentials文件中输入其他配置文件。
安迪

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

如果ecr登录失败,通常会引发此错误。我正在使用Windows系统,并且在管理员模式下使用“ Powershell”首先登录到ecr。

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

这应该输出“登录成功”。


谢谢!为什么有帮助?我已经使用saml2aws登录。
进水

2

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

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

在上面的路径中,这是我做错的地方:用"dkr.ecr.us-east-1.amazonaws.com"代替"west"。我使用的是“ east"。纠正错误后,便可以成功推送图像。


2

aws-cli给出的docker命令几乎没有实现...

使用docker登录时,docker将在您的钥匙串或〜/ .docker / config.json文件中保存一个server:key对

如果将密钥保存在https://7272727.dkr.ecr.us-east-1.amazonaws.com查找过程中,则在推送过程中将无法找到密钥,因为docker将寻找名为7272727.dkr.ecr.us-east-1.amazonaws.comnot 的服务器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'消息,然后您会感到很高兴
,因为您的push命令应该可以工作


2

有一种非常简单的方式将Docker映像推送到ECR:Amazon ECR Docker Credential Helper。只需根据提供的指南进行安装,即可~/.docker/config.json进行以下更新:

{
    "credsStore": "ecr-login"
}

,您将可以在没有的情况下推/拉图像docker login


按照本文中的说明进行操作后,我遇到了相同的错误。
ryechus

1

我也遇到了在OSX上运行的问题。我看到了Oliver Salzburg的响应,并检查了我的〜/ .docker / config.json。它具有来自我拥有的不同AWS账户的多个授权凭证。我删除了该文件,并在再次运行get-login后正常工作。



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,内部版本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)

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

如果您aws ecr get-login --region us-west-2 | bash在CI服务器中调用,则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
aws ecr get-login --region us-west-1 --no-include-email

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.