繁体   English   中英

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

[英]Docker push to AWS ECR fails on Windows: no basic auth credentials

我在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凭据导出为环境变量并重复该过程。 没有成功。

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

扰流警报

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

我的一次搜索使我得到了这个答案 ,虽然与我的案例无关,但却引起了我注意存储身份验证凭据的地方:docker config.json文件。 看看这里阅读更多关于它及其auth使用的信息。

但是,使用上述任何方法登录后,我自己的文件都有这些内容:

{
    "auths": {
        "https://123456789.dkr.ecr.us-east-1.amazonaws.com": {}
    },
    "credsStore": "wincred"
}

明确提到Windows( wincred )引起了我的注意。 阅读更多内容,Windows上的docker似乎使用了一个帮助凭据存储 ,这可能比在文件系统上将凭证存储为纯文本更好(它通常存储为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步:现在您可以推送泊坞窗图像了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM