我在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代码并生成会话凭据作为环境变量。没有成功(虽然该工具在其他时候是救生员,所以使用它)。
我最终设法解决了这个问题。虽然很令人沮丧但我没有在网上提到解决方案,所以写一个答案应该可以减轻一些心理上的痛苦。
答案 0 :(得分:11)
我的一次搜索引导我this answer,虽然与我的情况无关,但却提醒我注意存储身份验证凭据的位置:docker config.json
文件。请查看here以了解有关它及其身份验证的更多信息。
但是,使用上述任何方法登录后,我自己的文件都有这些内容:
{
"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
一切都很好。
答案 1 :(得分:5)
扩展你自己出色的答案,让我从监狱里出来。我发现如果你删除:
,
"credsStore": "wincred"
保存文件,再次运行docker login命令,它会将凭证直接放在我发现的config.json中。
留下一些像
的东西{
"auths": {
"https://407163548648.dkr.ecr.eu-west-1.amazonaws.com": {
"auth": "QV...Nbz0=",
"email": "AWS"
}
}
}
答案 2 :(得分:2)
在上述内容中添加更多内容,这可能是Docker提出的AWS兼容性问题以及AWS文档问题。在这种情况下,Docker通过使用Windows凭证存储做正确的事情,但AWS正试图使用证书身份验证来重载基本身份验证。
具体而言,实际运行docker login
会将条目添加到Windows凭据存储中。您可以通过打开Credential Manager,选择" Windows Credentials"并且您会看到您输入的https://12345678.dkr.ecs.region.amazonaws.com
网址的新条目。
问题是AWS使用公钥作为密码而Windows不允许您输入长的密码。您可以通过从AWS复制密码来尝试此操作,编辑存储的凭据并尝试粘贴该值.Windows不会让你。
答案 3 :(得分:0)
试试这个:
eval $(aws ecr get-login --no-include-email | sed 's|https://||')
答案 4 :(得分:0)
步骤1: 获取您的身份验证令牌:
aws --profile默认ecr获取授权令牌--region us-east-1-输出文本--queryauthorizationData []。authorizationToken
(注意:如果您有个人资料,则将默认名称更改为您的个人资料名称)
第2步:编辑〜/ .docker / config.json
{
"auths": {
"https://45456644454545.dkr.ecr.us-east-1.amazonaws.com": {
"auth": "TRdfdhwe53hsdshhSdSHdsdssdsd...GGSDe="
}
}
}
第3步:现在您可以推送docker映像了。