不能将图像推送到 Amazon ECR -失败原因 “no basic auth credentials”;

我正在尝试将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"错误。我不知道如何开始调试,因为所有的流量都是加密的。

更新

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

174533 次浏览

即使没有打开权限,这也应该可以工作。参见文档:私有注册中心认证

[编辑:实际上,我在做第二次测试时也遇到了权限问题。见Docker推送到AWS ECR私有回购失败,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

注:My ~/。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

我也经历过同样的问题。

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

之前,aws ecr get-login --region us-east-1用无效的EC注册中心URL生成docker登录命令。

如果你运行$(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登录命令,以验证docker到你的ECR注册表:

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

现在你应该能够docker push并让它直接进入你的ECR注册表。

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

我们今天也遇到了这个问题,并尝试了本文中提到的所有方法(除了生成AWS凭据)。

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

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

希望这能有所帮助

在我的情况下,这是一个错误与Docker的Windows和他们的支持Windows凭证管理器。

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

这将导致凭证被直接写入config.json。之后你需要重新登录。

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

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

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

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

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

修复工作为我是复制的结果到剪贴板与

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

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

我遇到这个问题的原因不同:我需要推送到一个与我的AWS帐户不关联的注册表(一个客户的ECR注册表)。客户端已经在注册表的Permissions选项卡下授予了我访问权限,通过添加我的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工作得很好。

  1. 请确保您已经创建了ECR注册表 然后根据ECR推送命令指令,剪切并粘贴以下命令
  2. 执行docker登录命令(Mac/Linux上的eval跳过剪切-粘贴)
    . xml eval $(aws ecr get-login --region us-east-1) < br > 如果您使用多个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获得的凭据是临时的,将会过期。

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

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

如果你为了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访问。

您必须确保您已经登录使用正确的凭证,请参阅官方错误说明和检查在这里

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

链接中描述了如何修复“没有基本身份验证”

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

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

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

在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

另见故障排除页面

如果这对谁有帮助的话……

我的问题是,我必须使用--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 ecr get-login中使用了正确的区域,它必须与创建存储库的区域相匹配。

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

这个命令给了我正确的登录命令。如果你不使用“——no-include-email”,它将抛出另一个错误。上面命令的输出看起来像这个docker login -u AWS -p **********************very big******。复制并执行它。现在会显示“Login Succeeded”。现在您可以将映像推到ECR。

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

试一试:

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

前推。

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

这个错误消息来自docker,它不一定与AWS有关,因为我在不使用AWS时也得到了相同的错误…它只是说docker没有从它碰巧使用的任何认证源获得授权

在我的例子中,在测试中我删除了目录~/。Docker得到了这个错误…在我反弹了我的本地docker注册表后,docker push就没问题了

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

我的问题是拥有多个AWS证书;因为我试图部署到开发,这是有效的:

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

执行该命令后:

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

只需从输出中运行docker登录命令

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

docker登录ECR的方式是什么

FWIW, Debian 9, Docker version 18.66.1 -ce, build e68fc7a:

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

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

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

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

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

我添加了区域选项,一切都很好为我:

aws ecr get-login --no-include-email --region eu-west-3

aws-cli给出的docker命令有点off…

当使用docker登录时,docker会在你的keychain或~/.docker/config中保存一个server:密钥对。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'消息,然后你就好了 之后,你的push命令应该工作

PowerShell中的窗户上,使用:

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

以下命令适用于我:

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

我在Docker论坛上发布了一个答案。在我的案例中,问题是centos“docker”不等同于docker CE,因此失败了:

没有基本认证

我只是通过在centos上安装“docker-ce”来修复。

参考:https://forums.docker.com/t/docker-push-to-ecr-failing-with-no-basic-auth-credentials/17358/30

有一个非常简单的方法将docker映像推送到ECR: 亚马逊ECR Docker凭据助手。只要根据提供的指南安装它,更新你的~/.docker/config.json如下:

{
"credsStore": "ecr-login"
}

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

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

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

这应该会输出“Login succeeded”。

Mac OSX

确保您的“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”

enter image description here

注意Where:字段

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

如果~/.docker/config中的auths键。json不匹配他们在钥匙串中的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": {}
},
我也遇到了同样的问题,用这个命令解决了它。我可以用,请按照你的账号更新 这是为Ubuntu机器,其中AWS-CLI需要安装Docker

algorithm_name='multi-model-xgboost'


account=$(aws sts get-caller-identity --query Account --output text)


# Get the region defined in the current configuration
region=$(aws configure get region)


aws ecr get-login-password --region ${region} | docker login --username AWS --password-stdin ${account}.dkr.ecr.${region}.amazonaws.com/${algorithm_name}

更新

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

确保您在本地运行Docker的用户就是您最终用于推送映像的用户。对我来说,使用sudo导致了这个问题。从命令中删除sudo可以解决这个问题。希望这能帮助和节省一些人的时间,没有人再犯同样愚蠢的错误。以下是输出,供您参考。

sudo docker push {your-account-id}.dkr.ecr.us-east-1.amazonaws.com/{repository-name}:{tag-name}
The push refers to repository [{your-account-id}.dkr.ecr.us-east-1.amazonaws.com/{repository-name}]
f13afaa342eb: Preparing
d01b75ce3235: Preparing
7eaa58141607: Preparing
519e8c5b2557: Preparing
15d4a3a33fec: Preparing
fdbbf41b1ab8: Waiting
4b88ecda5399: Waiting
e23a8e1e773f: Waiting
6623e2cc11cd: Waiting
no basic auth credentials

不带sudo跑步完全没问题

docker push {your-account-id}.dkr.ecr.us-east-1.amazonaws.com/{repository-name}:{tag-name}
The push refers to repository [{your-account-id}.dkr.ecr.us-east-1.amazonaws.com/{repository-name}]
f13afaa342eb: Pushed
d01b75ce3235: Pushed
7eaa58141607: Pushed
519e8c5b2557: Pushed
15d4a3a33fec: Pushed
fdbbf41b1ab8: Pushed
4b88ecda5399: Pushed
e23a8e1e773f: Pushed
6623e2cc11cd: Pushed
{tag-name}: digest: sha256:5ceaa5bf7605559582960b6d56a8eece9486ce0950bca9dd63a0dcd38a520bf0 size: 4293

所以我通过下载repo并自己编译来安装aws-credentials-helper。我发现我使用了错误的编译命令:make docker而不是make docker TARGET_GOOS=darwin(我在Mac上)。产生的bin/local/docker-credential-ecr-login最初是不可执行的。

刚刚进行了更新,从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标志

只是补充一下,以防有人像我一样从来没有读过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

工作很好

I had to run aws ecr get-login-password due to aws cli deprecating the get-login command.

Also in this version the username is forced to be hard coded as AWS.

Here was the command that worked for aws-cli/2.0.58.

aws ecr get-login-password --region region_y | docker login --username AWS --password-stdin account_x.dkr.ecr.region_y.amazonaws.com

登录成功

在Windows系统上,你必须清空下面的文件~/.docker/config.json,然后再次运行下面的脚本

aws ecr get-login --no-include-email --region ap-southeast-1 --profile [profile_name]

Docker CLI不支持原生IAM鉴权方法。对验证和授权Docker推和拉请求执行此步骤。

步骤- 1

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

aws configure

步骤- 2

你可以使用get-login-password将Docker认证到Amazon ECR私有注册表(推荐)

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

对于windows

(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)

对于windows

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

如果你的登录成功,那么你就可以开始了。否则引用Aws文档错误

步骤- 3

将您的图像推送到repo

  1. 标记你的图像

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

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

    Docker推送aws_account_id>.dkr.ecr..amazonaws.com/my-web-app

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

有效

我也有同样的问题。请按照以下步骤-

  1. Aws配置(配置您的凭据)
  2. 如果您已经创建了ECR存储库,在控制台中您可以找到一个带有“查看推送命令”的按钮。你在那里有三个命令,并且可以推。否则,下面是三个命令。
  3. aws ecr get-login-password—区域| docker登录—用户名aws—password-stdin .dkr.ecr.us-west-2.amazonaws.com
  4. 构建docker image - docker Build -t。
  5. Docker标签:最新的.dkr.ecr.us-west-2.amazonaws.com/:latest
  6. Docker推送.dkr.ecr.us-west-2.amazonaws.com/:latest

请注意-在。dkr.ecr.us-west-2.amazonaws.com中,该区域将是您的默认区域。对我来说是我们-西方-2,所以是一样的。

希望这节省了你的时间。

AWS放弃了get-login,请使用以下命令

aws ecr get-login-password --region <region> | docker login --username AWS --password-stdin <ecr-repo-full-path>

例子

aws ecr get-login-password --region ap-south-1 | docker login --username AWS --password-stdin 607348619222.dkr.ecr.ap-south-1.amazonaws.com

确保当前用户已被添加到docker组(即。你没有在docker命令前加上sudo等前缀。sudo docker push.....)。

因此,运行

  sudo usermod -aG docker $USER

请看附呈,enter image description here

## If you are using 2FA in AWS : To authenticate Docker and AWS
  1. 打开Ubuntu shell或类似工具。(不是Windows CMD或Powershell)

  2. 执行如下命令 aws sts get-session-token --serial-number "User ARN" --token-code "code_from_authenticator" < / p >

  3. 在C:\Users\user.aws\credentials"中创建temp (mfa)配置文件;然后使用2的输出。

    • (mfa)
    • Aws_access_key_id = XXXX
    • aws_secret_access_key = xxxx
    • Aws_session_token = XXX
    • 你所在的地区
  4. aws ecr get-login——profile mfa

  5. 从4复制输出。执行登录命令(删除“-e None”部分)

    • 登录成功!
  6. 执行aws push命令