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

Ale*_*ney 147 amazon-web-services docker aws-ecr

我正在尝试将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
Run Code Online (Sandbox Code Playgroud)

但是当我尝试推送我的图像时,我收到以下错误:

$ 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
Run Code Online (Sandbox Code Playgroud)

我确保aws用户拥有正确的权限.我还确保存储库允许该用户推送它.为了确保这不是问题,我将注册表设置为允许所有用户完全访问.没有任何更改"无基本身份验证凭据"错误.由于所有流量都已加密,我不知道如何开始调试.

UPDATE

所以当我意识到问题的根本原因时,我有一点荷马辛普森D'哦.我可以访问多个AWS账户.即使我使用aws configure为我设置存储库的帐户设置我的凭据,但aws cli实际上使用的是环境变量AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY.因此,当我执行aws ecr get-login时,它返回了错误帐户的登录信息.我没注意到帐号是不同的,直到我现在回去尝试一些建议的答案.当我删除环境变量时,一切正常.我想故事的座右铭是,如果您遇到此错误,请确保您登录的存储库与您应用于图像的标记相匹配.

Ant*_*eno 96

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

  • 如果你得到"未知的速记标志:'e'",你必须运行带有--no-include-email标志的命令,如下所示:$(aws ecr get-login --region us-east-1 - 没有包括电子邮件) (20认同)
  • 你是个传奇人物.除了步骤2之外,AWS指南还有5个步骤,所有步骤都是shell命令,只执行"运行上一步中返回的docker login命令".我想像我这样的一大堆人只关注shell命令而没有正确阅读指令 (16认同)
  • @VtoCorleone因为aws命令只是将docker命令打印到标准输出.如果你将该字符串包装在$()中,它将由shell解释,并且将运行`docker login`命令. (5认同)
  • $(aws ecr get-login --region us-west-2)未知速记标志:-e中的“ e”,请参阅“ docker login --help”。 (2认同)
  • 自 2020 年起,get-login 已弃用,请改用 get-login-password。https://docs.aws.amazon.com/cli/latest/reference/ecr/get-login.html (2认同)

Der*_*ler 56

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

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

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

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


小智 47

更新

由于 AWS CLI 版本 2 -aws ecr get-login已弃用,正确的方法是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

  • 你太棒了 (2认同)

Gre*_*reg 44

如果您使用配置文件,请不要忘记传递--profile=XXXaws ecr get-login.


Jam*_*111 26

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

aws ecr get-login --region ap-southeast-2
Run Code Online (Sandbox Code Playgroud)

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

docker login -u AWS -p <your_token_which_is_massive> -e none <your_aws_url>
Run Code Online (Sandbox Code Playgroud)

复制并粘贴此命令,然后运行docker push命令,如下所示:

docker push 8888888.blah.blah.ap-southwest-1.amazonaws.com/dockerfilename
Run Code Online (Sandbox Code Playgroud)

  • 完全一样。我是经过一番思考才发现的。 (2认同)

faz*_*azy 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
Run Code Online (Sandbox Code Playgroud)

获取身份验证令牌('docker password').

aws ecr get-authorization-token --region us-east-1 --output text \
    --query authorizationData[].authorizationToken | base64 -d | cut -d: -f2
Run Code Online (Sandbox Code Playgroud)

注意:我的〜/ .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>
Run Code Online (Sandbox Code Playgroud)

推送图像(假设您已制作泊坞窗图像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
Run Code Online (Sandbox Code Playgroud)


MrM*_*ins 12

试试:

eval $(aws ecr get-login --no-include-email | sed 's|https://||')
Run Code Online (Sandbox Code Playgroud)

在推之前.


Lan*_*ara 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

我遇到了同样的问题.

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

之前,aws ecr get-login --region us-east-1生成的docker login命令包含无效的EC注册表URL.


Tom*_*jes 8

Windows上的wincred凭证管理器中存在一个已知错误.从生成的登录命令中删除"https://"解决了这个问题.

docker login -u AWS -p <password> <aws_account_id>.dkr.ecr.<region>.amazonaws.com
Run Code Online (Sandbox Code Playgroud)

代替

docker login -u AWS -p <password> https://<aws_account_id>.dkr.ecr.<region>.amazonaws.com
Run Code Online (Sandbox Code Playgroud)

另请参阅故障排除页面.


kat*_*aja 7

Docker CLI 不支持本机 IAM 身份验证方法。要对Docker 推送和拉取请求进行身份验证和授权,请按照此步骤操作。

步骤1

检查 aws 凭证配置是否正确。要配置 AWS 凭证,请运行以下命令并提供您的 aws 凭证。

aws configure
Run Code Online (Sandbox Code Playgroud)

第2步

您可以使用 get-login-password 对 Amazon ECR 私有注册表进行 Docker 身份验证(推荐)

Linux 和 MSC

aws ecr get-login-password --region <your region> | docker login --username AWS --password-stdin <aws_account_id>.dkr.ecr.<your region>.amazonaws.com
Run Code Online (Sandbox Code Playgroud)

用于窗户

(Get-ECRLoginCommand).Password | docker login --username AWS --password-stdin aws_account_id.dkr.ecr.<your region>.amazonaws.com
Run Code Online (Sandbox Code Playgroud)

或者

您还可以使用 --get-login 方法(但公开凭据)(不推荐)。

适用于 Linux 和 Mac

$(aws ecr get-login --region <your region> --no-include-email)
Run Code Online (Sandbox Code Playgroud)

用于窗户

Invoke-Expression -Command (Get-ECRLoginCommand -Region <your region>).Command
Run Code Online (Sandbox Code Playgroud)

如果您登录成功,那么您就可以开始了。否则请参阅aws 文档以获取错误

步骤 - 3

将您的图像推送到仓库

  1. 标记您的图像

    docker 标签 <aws_account_id>.dkr.ecr..amazonaws.com/my-web-app

  2. 使用以下命令推送您的图像。

    docker Push <aws_account_id>.dkr.ecr..amazonaws.com/my-web-app

注意:这是基于令牌的登录,生成的授权令牌仅在 12H 内有效


Igo*_*man 6

的WindowsPowerShell中,使用:

Invoke-Expression $(aws ecr get-login --no-include-email)
Run Code Online (Sandbox Code Playgroud)


Jas*_*ark 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
Run Code Online (Sandbox Code Playgroud)

这当然导致了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 #})
Run Code Online (Sandbox Code Playgroud)

之后,docker push工作得很好。


Jas*_*son 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是临时的,将过期.


Jul*_*bal 5

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


Gab*_*son 5

刚刚有一个更新,从 AWS 中删除了 get-login,而是使用 get-login-password:

sudo docker login -u AWS -p $(aws ecr get-login-password --region <region> - 
-profile <profile>) <account id>.dkr.ecr.eu-north-1.amazonaws.com 
Run Code Online (Sandbox Code Playgroud)

如果使用默认凭据,请不要忘记删除 --profile 标志