Docker推送到AWS ECR在Windows上失败:没有基本身份验证凭据

时间:2016-07-10 17:29:10

标签: windows amazon-web-services docker amazon-ecs

我在Windows上使用docker(Docker for Windows,而不是Docker Toolbox)和aws cli in cygwin(" git bash")shell。我试图将docker镜像推送到AWS ECR - 私有ECS存储库。

无论我做什么 - 当我跑docker push时,我反复得到:

no basic auth credentials

方法1

我一直在遵循说明并运行标准命令:

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

嗯。

方法2

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 pushpull会导致同样的失败。

其他死胡同

Windows和cygwin很奇怪。因此,让我们将docker login命令放在shell脚本文件中,然后运行它,或者将其源化。没有成功。

使用显式访问令牌和新的凭据集生成其他AMI配置文件。没有成功。

将AWS凭据导出为环境变量并重复该过程。没有成功。

使用令人敬畏的aws-temp-token.sh脚本获取MFA代码并生成会话凭据作为环境变量。没有成功(虽然该工具在其他时候是救生员,所以使用它)。

扰流警报

我最终设法解决了这个问题。虽然很令人沮丧但我没有在网上提到解决方案,所以写一个答案应该可以减轻一些心理上的痛苦。

5 个答案:

答案 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映像了。