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

问题描述 投票:10回答:5

我在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代码并生成会话凭证作为环境变量。没有成功(虽然该工具在其他时候是一个救生员,所以使用它)。

扰流警报

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

windows amazon-web-services docker amazon-ecs
5个回答
13
投票

我的一次搜索让我进入了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

一切都很好。


5
投票

扩展你自己出色的答案,让我从监狱里出来。我发现如果你删除:

,
"credsStore": "wincred"

保存文件,再次运行docker login命令,它会将凭证直接放在我发现的config.json中。

离开的东西有点像

{
    "auths": {
        "https://407163548648.dkr.ecr.eu-west-1.amazonaws.com": {
            "auth": "QV...Nbz0=",
            "email": "AWS"
        }
    }
}

2
投票

添加更多内容,这可能是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不会让您这样做。


0
投票

试试这个:

eval $(aws ecr get-login --no-include-email | sed 's|https://||')

0
投票

第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步:现在您可以推送泊坞窗图像了。

© www.soinside.com 2019 - 2024. All rights reserved.