我正在尝试将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”错误。我不知道如何开始调试,因为所有的流量都是加密的。
更新
So I had a bit of Homer Simpson D'Oh moment when I realized the root cause of my problem. I have access to multiple AWS accounts. Even though I was using aws configure to set my credentials for the account where I had setup my repository the aws cli was actually using the environment variables AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY. So when I did aws ecr get-login it was returning a login for the wrong account. I failed to notice that the account numbers were different until I just went back now to try some of the proposed answers. When I remove the environment variables everything works correctly. I guess the motto of the story is if you hit this error, make sure that the repository you are logging into matches the tag you have applied to the image.
即使没有打开权限,这也应该可以工作。请参阅文档:私有注册中心身份验证。
[编辑:实际上,我在做第二次测试时也遇到了权限问题。参见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图像测试):
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 ecr get-login——region us-east-1),一切都会为你完成
2021年7月更新:
在AWS CLI的版本1中,get-login现在已弃用。如果您正在使用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推送,并让它直接进入你的ECR注册表。
我遇到这个问题的原因不同:我需要推送到一个与我的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
这当然会导致没有基本的认证凭证。事实证明,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工作得很好。
我也有这个问题。发生在我身上的事情是我忘记运行在我运行后返回给我的命令
aws ecr get-login --region ap-southeast-2
该命令返回一个大blob,其中包括docker登录命令!我没有意识到。它应该返回如下内容:
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/配置。手动json。
假设你有这些设置:
ECR由AWS帐户ID 00000000000000拥有
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访问。
aws-cli给出的docker命令有点错误…
当使用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://||')
一旦你运行命令,你会得到“登录成功”的消息,然后你就好了
之后,您的push命令应该可以工作
Mac OSX
确保您的“auths”密钥与您的凭据存储密钥完全匹配
检查docker配置:
猫~ / .docker / 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匹配Keychain Access中的Where:字段。
如果认证者输入~/.docker/config. conf。在keychain中:字段,你可能会得到Login Succeeded from docker Login…但是仍然得到
错误:服务“web”未能构建:获得https://55511155511.dkr.ecr.us-east-1.amazonaws.com/v2/path/to/image/latest:没有基本的身份验证凭据,当你试图拉。
在我的例子中,我需要添加https://
原始
"auths": {
"55511155511.dkr.ecr.us-east-1.amazonaws.com": {}
},
固定
"auths": {
"https://55511155511.dkr.ecr.us-east-1.amazonaws.com": {}
},
确保您在本地运行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
这只是为了防止有人像我一样从来没有读过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
工作很好
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
or
您也可以使用——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
将您的映像推到回购
标记你的图像
Docker标签<aws_account_id>.dkr.ecr..amazonaws.com/my-web-app
使用以下命令推送图像。
Docker push <aws_account_id>.dkr.ecr..amazonaws.com/my-web-app
注意:这是基于令牌的登录和生成的授权令牌
仅12H有效