我在windows上使用docker(Docker for Windows,而不是Docker Toolbox)和aws cli in cygwin(“git bash”)shell。我正在尝试将docker镜像推送到AWS ECR - 私有ECS存储库。
无论我做什么 - 当我运行docker push
时,我反复得到:
no basic auth credentials
我一直在遵循说明并运行标准命令:
$ $(aws --profile myprofile ecr get-login --region us-east-1)
Login Succeeded
$ docker tag myrepo:latest 123456789.dkr.ecr.us-east-1.amazonaws.com/myrepo:latest
$ docker push 123456789.dkr.ecr.us-east-1.amazonaws.com/myrepo:latest
The push refers to a repository [232097583865.dkr.ecr.us-east-1.amazonaws.com/potion]
688f61a6956d: Preparing
11908ead416e: Preparing
no basic auth credentials
没有成功。
试图揭示确实,我没有访问权限:
$ docker pull 123456789.dkr.ecr.us-east-1.amazonaws.com/myrepo
Using default tag: latest
Pulling repository 123456789.dkr.ecr.us-east-1.amazonaws.com/myrepo
unauthorized: authentication required
但是,docker确实认为我已登录:
$ docker logout https://123456789.dkr.ecr.us-east-1.amazonaws.com
Remove login credentials for https://123456789.dkr.ecr.us-east-1.amazonaws.com
# let's run again - should not be logged in now
$ docker logout https://123456789.dkr.ecr.us-east-1.amazonaws.com
Not logged in to https://123456789.dkr.ecr.us-east-1.amazonaws.com
嗯。
Internet建议解析命令并使用较旧的过程登录。
基本上归结为这样的事情:
docker login -u AWS -p $(aws --profile myprofile ecr get-authorization-token --region us-east-1 --output text --query authorizationData[].authorizationToken | python -c 'import base64, sys; print base64.b64decode(sys.stdin.read())' | cut -d: -f2) https://123456789.dkr.ecr.us-east-1.amazonaws.com
这似乎也成功了,但docker push
或pull
导致同样的失败。
Windows和cygwin很奇怪。所以,让我们将docker login
命令放在shell脚本文件中,然后运行它,或者将它源化。没有成功。
使用显式访问令牌和新的凭据集生成其他AMI配置文件。没有成功。
将AWS凭据导出为环境变量并重复该过程。没有成功。
使用令人敬畏的aws-temp-token.sh脚本,该脚本接受MFA代码并生成会话凭证作为环境变量。没有成功(虽然该工具在其他时候是一个救生员,所以使用它)。
我最终设法解决了这个问题。虽然这是令人沮丧的,但我没有在网上提到解决方案,所以写一个答案应该可以减轻一些精神上的痛苦。
我的一次搜索让我进入了this answer,虽然与我的情况无关,但却引起了我注意存储身份验证凭据的地方:docker config.json
文件。看看here,了解更多关于它及其auth的使用情况。
但是,使用上述任何方法登录后,我自己的文件都有这些内容:
{
"auths": {
"https://123456789.dkr.ecr.us-east-1.amazonaws.com": {}
},
"credsStore": "wincred"
}
明确提到Windows(wincred
)引起了我的注意。进一步阅读,看来Windows上的docker使用helper credential store,这可能比在文件系统上以明文形式存储凭证更好(它通常存储为base64,对于“纯文本”是希腊语)。
但是 - 当我手动编辑此文件以直接包含身份验证令牌时,解决方案就出现了。
我使用此命令生成了我的身份验证令牌(为简洁起见,缩短了输出):
$ aws --profile myprofile ecr get-authorization-token --region us-east-1 --output text --query authorizationData[].authorizationToken
jFHNnVxZ............Vqc==
编辑~/.docker/config.json
后,它看起来像这样:
{
"auths": {
"https://123456789.dkr.ecr.us-east-1.amazonaws.com": {
"auth": "jFHNnVxZ............Vqc=="
}
}
}
有了这个,推动终于成功了:
$ docker push 123456789.dkr.ecr.us-east-1.amazonaws.com/myrepo:latest
The push refers to a repository [123456789.dkr.ecr.us-east-1.amazonaws.com/myrepo]
61a69688f56d: Pushed
11ad4908e16e: Pushed
myrepo: digest: sha256:20c0f3......82aa19 size: 42162
一切都很好。
扩展你自己出色的答案,让我从监狱里出来。我发现如果你删除:
,
"credsStore": "wincred"
保存文件,再次运行docker login命令,它会将凭证直接放在我发现的config.json中。
离开的东西有点像
{
"auths": {
"https://407163548648.dkr.ecr.eu-west-1.amazonaws.com": {
"auth": "QV...Nbz0=",
"email": "AWS"
}
}
}
添加更多内容,这可能是Docker提出的AWS兼容性问题以及AWS文档问题。在这种情况下,Docker通过使用Windows凭据存储做正确的事情,但是AWS正在尝试使用证书身份验证来重载基本身份验证。
具体来说,运行docker login
实际上会将条目添加到Windows凭据存储中。您可以通过打开Credential Manager,选择“Windows Credentials”来查看,您将看到输入的https://12345678.dkr.ecs.region.amazonaws.com
URL的新条目。
问题是AWS使用公钥作为密码,Windows不允许您输入长的密码。您可以通过从AWS复制密码,编辑存储的凭据并尝试粘贴该值来尝试此操作.Windows不会让您这样做。
试试这个:
eval $(aws ecr get-login --no-include-email | sed 's|https://||')
第1步:获取您的身份验证令牌:
aws --profile default ecr get-authorization-token --region us-east-1 --output text --query authorizationData[].authorizationToken
(注意:如果您有个人资料,请将默认值更改为您的个人资料名称)
第2步:编辑〜/ .docker / config.json
{
"auths": {
"https://45456644454545.dkr.ecr.us-east-1.amazonaws.com": {
"auth": "TRdfdhwe53hsdshhSdSHdsdssdsd...GGSDe="
}
}
}
第3步:现在您可以推送泊坞窗图像了。