Amazon web services Can';t将图像推送到Amazon ECR-失败的原因是;无基本身份验证凭据”;

Amazon web services Can';t将图像推送到Amazon ECR-失败的原因是;无基本身份验证凭据”;,amazon-web-services,docker,aws-ecr,Amazon Web Services,Docker,Aws Ecr,我正在尝试将docker图像推送到Amazon ECR注册表。我正在使用docker客户端docker版本1.9.1,构建a34a1d5。我使用aws ecr get login——地区us-east-1获取docker登录凭据。然后,我成功地使用这些凭据登录,如下所示: docker login -u AWS -p XXXX -e none https://####.dkr.ecr.us-east-1.amazonaws.com WARNING: login credentials saved

我正在尝试将docker图像推送到Amazon ECR注册表。我正在使用docker客户端docker版本1.9.1,构建
a34a1d5
。我使用aws ecr get login——地区us-east-1获取docker登录凭据。然后,我成功地使用这些凭据登录,如下所示:

docker login -u AWS -p XXXX -e none https://####.dkr.ecr.us-east-1.amazonaws.com
WARNING: login credentials saved in /Users/ar/.docker/config.json
Login Succeeded
但是,当我尝试推送图像时,会出现以下错误:

$ docker push ####.dkr.ecr.us-east-1.amazonaws.com/image:latest
The push refers to a repository [####.dkr.ecr.us-east-1.amazonaws.com/image] (len: 1)
bcff5e7e3c7c: Preparing 
Post https://####.dkr.ecr.us-east-1.amazonaws.com/v2/image/blobs/uploads/: no basic auth credentials
我确保aws用户具有正确的权限。我还确保存储库允许该用户推送到它。为了确保这不是一个问题,我将注册表设置为允许所有用户完全访问。“无基本身份验证凭据”错误不会发生任何更改。我不知道如何开始调试,因为所有的流量都是加密的

更新


所以当我意识到问题的根本原因时,我有了一点荷马·辛普森的灵感。我可以访问多个AWS帐户。即使我使用
aws configure
为我设置存储库的帐户设置凭据,aws cli实际上还是使用了环境变量
aws\u ACCESS\u KEY\u ID
aws\u SECRET\u ACCESS\u KEY
。因此,当我使用aws ecr get login时,它返回了一个错误帐户的登录名。我没有注意到账号是不同的,直到我现在才回去尝试一些建议的答案。当我删除环境变量时,一切都正常工作。我猜故事的格言是,如果您遇到此错误,请确保您登录的存储库与您应用于图像的标记匹配。

即使没有打开权限,这也应该有效。请参阅文档:

[编辑:实际上,我在进行第二次测试时也遇到了权限问题。请参阅。]

然而,我也有同样的问题;我不知道为什么,但我成功地使用了文档中描述的更冗长的身份验证机制

AWS CLI和Docker版本:

$ aws --version
aws-cli/1.9.17 Python/2.7.6 Linux/3.16.0-38-generic botocore/1.3.17
$ docker --version
Docker version 1.9.1, build a34a1d5
获取身份验证令牌(“docker密码”)

注意:My~/.aws/config指定了不同的默认区域,因此我需要显式设置
--region us-east-1

以交互方式登录(将
更改为您的AWS帐户id):


我也经历过同样的问题

生成新的AWS凭据(访问密钥)并使用新凭据重新配置AWS CLI解决了该问题


早些时候,
aws ecr get login——地区us-east-1
生成的docker登录命令带有无效的EC注册表URL。

如果您运行
$(aws ecr get login——地区us-east-1)
如果您使用配置文件,不要忘记将
--profile=XXX
传递到
aws ecr get login
在我的情况下,这是Docker for Windows及其对Windows凭据管理器的支持的一个错误

打开
~/.docker/config.json
并删除
“credstore”:“wincred”
条目

这将导致凭据直接写入
config.json
。之后你必须再次登录


您可以通过票证和GitHub跟踪这个bug。

我在OSX上也遇到过这个问题。我看到了Oliver Salzburg的回复,并检查了我的~/.docker/config.json。它里面有来自不同AWS帐户的多个授权凭据。我删除了该文件,再次运行get login后,该文件正常工作。

AWS文档告诉您执行以下命令(对于ap-Southwest-2区域)

当我遇到这个问题时,根据文档,我不清楚您需要将该命令的结果输入终端并执行它

对我有效的修复方法是用

aws ecr get-login --region ap-southeast-2 | pbcopy

将结果粘贴到命令行并执行它

我遇到这个问题的原因不同:我需要推送到与我的AWS帐户(客户端的ECR注册表)无关的注册表。客户端通过添加我的IAM id(例如,
arn:aws:IAM::{aws ACCT#}:user/{Username}
)作为主体,在注册表的“权限”选项卡下授予我访问权限。我尝试按常规步骤登录:

$(aws ecr get-login --region us-west-2 --profile profilename)
docker push {Client AWS ACCT #}.dkr.ecr.us-west-1.amazonaws.com/imagename:latest
这当然会导致
没有基本的身份验证凭据
aws ecr get login
将您登录到ecr中与您的登录相关联的注册表,这在retrospect中很有意义。解决方案是告诉aws ecr get login您要登录的注册表

$(aws ecr get-login --region us-west-2 --profile profilename --registry-ids {Client AWS ACCT #})
在那之后,
docker-push
工作正常

  • 确保已首先创建ECR注册表。
    然后按照ECR Push命令说明,剪切并粘贴以下命令
  • 执行docker登录命令(Mac/Linux上的eval跳过剪切和粘贴)
    eval$(aws ecr获取登录——美国东部地区-1)

    如果使用多个AWS帐户,则添加--配置文件
    eval$(aws ecr get login——地区us-east-1——配置您的配置文件)
  • docker build-t映像名。
  • docker标签图像名称:latest###############dkr.ecr.us-east-1.amazonaws.com/图像名称:latest
  • docker push.dkr.ecr.us-east-1.amazonaws.com/image name:latest

  • 如果出现错误,请确保再次运行所有命令!您使用aws ecr get login获得的凭据是临时的,将过期。

    我也有此问题。发生在我身上的事情是,我忘记运行在运行之后返回给我的命令

    aws ecr get-login --region ap-southeast-2
    
    该命令返回一个大blob,其中包括
    docker login
    命令!我没有意识到。它应该返回如下内容:

    docker login -u AWS -p <your_token_which_is_massive> -e none <your_aws_url>
    
    docker push 8888888.blah.blah.ap-southwest-1.amazonaws.com/dockerfilename
    

    我也面临同样的问题,我犯的错误是使用了错误的回购路径

    例如:
    docker push xxxxxxxxxxxxx.dkr.ecr.us-east-1.amazonaws.com/jenkins:latest

    在上面的路径中,我犯了一个错误:在
    “d中
    
    $(aws ecr get-login --region us-west-2 --profile profilename --registry-ids {Client AWS ACCT #})
    
    aws ecr get-login --region ap-southeast-2
    
    docker login -u AWS -p <your_token_which_is_massive> -e none <your_aws_url>
    
    docker push 8888888.blah.blah.ap-southwest-1.amazonaws.com/dockerfilename
    
    docker login -u AWS -p <password> <aws_account_id>.dkr.ecr.<region>.amazonaws.com
    
    docker login -u AWS -p <password> https://<aws_account_id>.dkr.ecr.<region>.amazonaws.com
    
    eval $(aws ecr get-login --no-include-email | sed 's|https://||')
    
    $(aws ecr get-login --no-include-email --region eu-west-1 --profile dev | sed 's|https://||')
    
    $(AWS_PROFILE=<YOUR PROFILE> aws ecr get-login --no-include-email --region eu-west-1)
    
    eval $(aws ecr get-login --no-include-email --region us-east-1 --profile yourprofile | sed 's|https://||')
    
    Invoke-Expression $(aws ecr get-login --no-include-email)
    
    sudo $(aws ecr get-login --region us-east-1 --no-include-email)
    
    sudo docker tag e9ae3c220b23(image_id) aws_account_id.dkr.ecr.region.amazonaws.com/my-web-app
    
    sudo docker push aws_account_id.dkr.ecr.region.amazonaws.com/my-web-app
    
    {
        "credsStore": "ecr-login"
    }
    
    Invoke-Expression $(aws ecr get-login --no-include-email)
    
    {
        "auths": {
            "https://55511155511.dkr.ecr.us-east-1.amazonaws.com": {}
        },
        "HttpHeaders": {
            "User-Agent": "Docker-Client/19.03.5 (darwin)"
        },
        "credsStore": "osxkeychain"
    }
    
        "auths": {
            "55511155511.dkr.ecr.us-east-1.amazonaws.com": {}
        },
    
        "auths": {
            "https://55511155511.dkr.ecr.us-east-1.amazonaws.com": {}
        },
    
    sudo docker login -u AWS -p $(aws ecr get-login-password --region <region> - 
    -profile <profile>) <account id>.dkr.ecr.eu-north-1.amazonaws.com 
    
    aws configure
    
    aws ecr get-login-password --region <your region> | docker login --username AWS --password-stdin <aws_account_id>.dkr.ecr.<your region>.amazonaws.com
    
    (Get-ECRLoginCommand).Password | docker login --username AWS --password-stdin aws_account_id.dkr.ecr.<your region>.amazonaws.com
    
    $(aws ecr get-login --region <your region> --no-include-email)
    
    Invoke-Expression -Command (Get-ECRLoginCommand -Region <your region>).Command