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

Posted

技术标签:

【中文标题】无法将图像推送到 Amazon ECR - 因“没有基本身份验证凭证”而失败【英文标题】:Can't push image to Amazon ECR - fails with "no basic auth credentials" 【发布时间】:2016-04-13 20:49:37 【问题描述】:

我正在尝试将 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 用户具有正确的权限。我还确保存储库允许该用户推送到它。只是为了确保这不是问题,我将注册表设置为允许所有用户完全访问。没有任何改变 "no basic auth credentials" 错误。我不知道如何开始调试,因为所有流量都是加密的。

更新

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

【问题讨论】:

您应该将该更新设置为粗体、下划线和斜体。我也刚刚经历了荷马辛普森的时刻。谢谢! 感谢您缩小范围!你真的拯救了我的一天! 仓库不存在时也会报同样的错误。检查您是否在正确的区域创建了 repo。 docs.aws.amazon.com/AmazonECR/latest/userguide/… 请注意,您可以设置您的 aws cli 来处理多个用户配置文件:docs.aws.amazon.com/cli/latest/userguide/… 【参考方案1】:

如果你运行$(aws ecr get-login --region us-east-1),一切都会为你完成

2021 年 7 月更新:

get-login 现在在 AWS CLI 的版本 1 中已弃用。如果您使用的是 AWS CLI 版本 2,则必须使用 get-login-password

您可以将get-login-password 的输出通过管道传输到您的 docker login 命令,以向您的 ECR 注册表验证 docker:

aws ecr get-login-password | docker login --username AWS --password-stdin ####.dkr.ecr.us-east-1.amazonaws.com

现在您应该可以docker push 并让它直接进入您的 ECR 注册表。

【讨论】:

你是个传奇。 AWS 指南有 5 个步骤,除了第 2 步之外,所有步骤都带有一个 shell 命令,它只说“运行在上一步中返回的 docker login 命令”。我猜像我这样的一大堆人只是专注于 shell 命令并且没有正确阅读指令 @VtoCorleone 因为 aws 命令只是将 docker 命令打印到标准输出。如果将该字符串包装在 $() 中,它将由 shell 解释并运行 docker login 命令。 $(aws ecr get-login --region us-west-2) 未知速记标志:'e' in -e 请参阅'docker login --help'。 如果您收到“未知速记标志:'e'”,则必须运行带有 --no-include-email 标志的命令,如下所示:$(aws ecr get-login --地区 us-east-1 --no-include-email) 自 2020 年起,get-login 已弃用,请改用 get-login-password。 docs.aws.amazon.com/cli/latest/reference/ecr/get-login.html【参考方案2】:

在我的情况下,这是 Docker for Windows 及其对 Windows 凭据管理器的支持的一个错误。

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

这将导致凭据直接写入config.json。之后您必须重新登录。

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

【讨论】:

谢谢 - 在 Windows 10 上工作。从配置中删除该属性并再次运行 docker login 命令后,配置文件已更新为凭据,并且推送工作正常。 我找不到配置文件。你能建议我 config.json 文件的位置吗? @RamashankerTripathi 位置在答案中。我不知道我怎么能更清楚。 @OliverSalzburg 感谢您的回复。实际上我的 Docker 安装目录不包含 config.json 文件。 @RamashankerTripathi ~/.docker 表示您的主目录中的 .docker。试试%HOMEDRIVE%%HOMEPATH%\.docker【参考方案3】:

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

【讨论】:

刚刚从 AWS 中删除了 get-login 的更新,改为使用 get-login-password:sudo docker login -u AWS -p $(aws ecr get-login-password --region eu-north-1 --profile <profile>) <account id>.dkr.ecr.eu-north-1.amazonaws.com。如果使用默认凭据,请不要忘记删除 --profile 标志。【参考方案4】:

更新

由于 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

【讨论】:

我收到unknown flag: --region @kittu 为我工作。您使用的是哪个 aws cli 版本? 你太棒了【参考方案5】:

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

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

此命令返回一个大块,其中包括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

【讨论】:

我不知道那个 blob 响应是什么,所以我忽略了它。哈哈。感谢您指出这一点!【参考方案6】:

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

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

尽管如此,我也遇到了同样的问题;我不知道为什么,但我成功地使用了get-authorization-token 的文档中描述的更冗长的身份验证机制

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 密码')。

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 快速启动终端,它似乎没有很好的复制/粘贴功能,或者我只是想不通。 对于其他想知道的人来说,我只需要标记并复制整个内容,包括空格,然后将其粘贴到记事本中。从那里,我删除换行符,并重新复制所有内容,只有 then 可以粘贴到终端命令行中。那行得通。 如果您使用的是 PowerShell,请转到“属性”>“选项”选项卡并选择“启用换行选择”。这样,您可以单击并拖动以选择换行,而无需手动复制到记事本、删除新行等。 我已经快 10 年没碰过 windows 机器了,但你总是可以通过管道将 stdout 输出到一个文件:aws ecr get-authorization-token &gt; config.json,然后在你最喜欢的文本编辑器中打开它来随意复制和粘贴 【参考方案7】:

尝试:

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

推送之前。

【讨论】:

我收到了这个no basic auth credentials Invalid IPv6 URL【参考方案8】:

如果它可以帮助任何人......

我的问题是我必须使用 --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_PROFILE=myprofile aws ecr get-login,但它没有用,但引入带有 --profile 参数的 aws 配置文件就可以了!【参考方案9】:

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。

【讨论】:

【参考方案10】:

我遇到了同样的问题。

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

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

【讨论】:

同样的事情发生在我身上。谢谢! 这是我的问题。我在 ~/.aws/credentials 中存储的 AWS CLI 凭证与我管理的 aws 不同。重新创建了有效的新凭据和设置。【参考方案11】:
    确保您首先创建了 ECR 注册表。 然后按照 ECR 推送命令说明,剪切并粘贴以下命令 执行 docker login 命令(Mac/Linux 上的 eval 跳过剪切和粘贴)eval $(aws ecr get-login --region us-east-1) 如果您使用多个 AWS 账户,请添加 --profileeval $(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 获得的凭据是临时的,将会过期。

【讨论】:

我在哪里可以找到your-profile 的内容? 如果您使用默认配置文件,您可以将其省略 我试图弄清楚如何不使用默认配置文件。不过我想通了,可以在~/.aws/config~/.aws/credentials 文件中输入额外的配置文件。【参考方案12】:

PowerShell 中的 Windows 上,使用:

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

【讨论】:

这仍然相关【参考方案13】:

我遇到此问题的原因不同:我需要推送到与我的 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。 As it turns out、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ă 只有在使用命名配置文件时才应该包含它。见这里docs.aws.amazon.com/cli/latest/userguide/…【参考方案14】:

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

【讨论】:

【参考方案15】:

刚刚从 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 

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

【讨论】:

【参考方案16】:

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

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

当我遇到这个问题时,根据该文档,我并不清楚您需要将此命令的结果输入终端并执行它。

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

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

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

【讨论】:

【参考方案17】:

运行此命令后:

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

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

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

是docker登录ECR的方式

【讨论】:

【参考方案18】:

Docker CLI 不支持原生 IAM 身份验证方法。要authenticate and authorize Docker push and pull requests,请按照此步骤操作。

步骤 - 1

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

aws configure

步骤 - 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

适用于窗户

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

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

适用于 linux 和 mac

$(aws ecr get-login --region <your region> --no-include-email)

适用于窗户

Invoke-Expression -Command (Get-ECRLoginCommand -Region <your region>).Command

如果您登录成功,那么您就可以开始了。否则请参考aws docs for error

步骤 - 3

Push your image to repo

    标记您的图像

    泊坞窗标签 .dkr.ecr..amazonaws.com/my-web-app

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

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

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

【讨论】:

【参考方案19】:

aws-cli 给出的 docker 命令有点不对...

使用 docker login 时,docker 会在您的钥匙串或 ~/.docker/config.json 文件中保存一个 server:key 对

如果它将密钥保存在 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' 消息,然后您就很好了 之后您的推送命令应该可以工作

【讨论】:

【参考方案20】:

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

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

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

【讨论】:

谢谢!为什么这有帮助?我已经使用 saml2aws 登录了。【参考方案21】:

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

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

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

【讨论】:

【参考方案22】:

以下命令对我有用:

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

【讨论】:

【参考方案23】:

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


    "credsStore": "ecr-login"

您将能够在没有docker login 的情况下推/拉您的图像。

【讨论】:

按照本文中的说明操作后,我得到了同样的错误。 安装助手插件后为我工作。【参考方案24】:

只是补充一下,以防有人像我一样从未读过 F 手册 我按照上面的所有建议步骤进行操作,例如

aws ecr get-login-password --region eu-west-1 | docker login --username AWS --password-stdin 123456789.dkr.ecr.eu-west-1.amazonaws.com

而且总是没有基本的身份验证凭据 我创建了一个名为

的注册表
123456789.dkr.ecr.eu-west-1.amazonaws.com/my.registry.com/namespace 

并试图推送一个名为 alpine:latest 的图像

123456789.dkr.ecr.eu-west-1.amazonaws.com/my.registry.com/namespace/alpine:latest
2c6e8b76de: Preparing
9d4cb0c1e9: Preparing
1ca55f6ab4: Preparing
b6fd41c05e: Waiting
ad44a79b33: Waiting
2ce3c1888d: Waiting
no basic auth credentials   

代表我犯了一个愚蠢的错误,因为我必须使用完整的容器路径在 ecr 中创建一个注册表。 我使用完整容器路径创建了一个新注册表,而不是以命名空间结尾

123456789.dkr.ecr.eu-west-1.amazonaws.com/my.registry.com/namespace/alpine

然后低并看向

123456789.dkr.ecr.eu-west-1.amazonaws.com/my.registry.com/namespace/alpine:latest 
The push refers to repository [123456789.dkr.ecr.eu-west-1.amazonaws.com/my.registry.com/namespace/alpine]
0c8667b5b: Pushed
730460948: Pushed
1.0: digest: sha256:e1f814f3818efea45267ebfb4918088a26a18c size: 7

效果很好

【讨论】:

【参考方案25】:

我在 OSX 上运行时也遇到了这个问题。我看到了 Oliver Salzburg 的回复并检查了我的 ~/.docker/config.json。它内部有多个来自我拥有的不同 AWS 账户的授权凭证。我删除了文件,再次运行 get-login 后它工作了。

【讨论】:

【参考方案26】:

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

【讨论】:

【参考方案27】:

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

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

【讨论】:

【参考方案28】:

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

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

【讨论】:

【参考方案29】:

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

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

【讨论】:

【参考方案30】:

对于 Mac OSX

TL;DR 确保您的“auths”密钥与您的凭证存储密钥完全匹配

检查您的 docker 配置:

cat ~/.docker/config.json

样本结果:


    "auths": 
        "https://55511155511.dkr.ecr.us-east-1.amazonaws.com": 
    ,
    "HttpHeaders": 
        "User-Agent": "Docker-Client/19.03.5 (darwin)"
    ,
    "credsStore": "osxkeychain"

请注意,“auths”值是一个空对象,并且 docker 正在使用凭证存储“osxkeychain”。

打开 Mac 的“Keychain Access”应用,找到名称“Docker Credentials”

注意Where: 字段

确保~/.docker/config.json 中的auths 键与钥匙串访问中的Where: 字段匹配。

如果 ~/.docker/config.json 中的 auths 键与钥匙串中的 Where: 字段不匹配,您可能会从 docker login... 获得 Login Succeeded 但仍会获得 ERROR: Service 'web' failed to build: Get https://55511155511.dkr.ecr.us-east-1.amazonaws.com/v2/path/to/image/latest: no basic auth credentials 当你尝试拉动时。

就我而言,我需要添加https://

原创

    "auths": 
        "55511155511.dkr.ecr.us-east-1.amazonaws.com": 
    ,

已修复

    "auths": 
        "https://55511155511.dkr.ecr.us-east-1.amazonaws.com": 
    ,

【讨论】:

只有在我将https:// 添加到auths 之后,ubuntu 上的 docker pull 才开始工作。谢谢!

以上是关于无法将图像推送到 Amazon ECR - 因“没有基本身份验证凭证”而失败的主要内容,如果未能解决你的问题,请参考以下文章

如何将构图图像推送到ECR?

AWS ECR Repository - 如何从一个账户复制图像并推送到另一个账户

将 docker 容器从本地推送到 aws ecr

将文件推送到 Amazon Cloudfront:可能吗?

Github Actions Build - 在多个文件夹上推送到 ECR

Docker 推送到 AWS ECR 私有存储库失败,JSON 格式错误