我正在尝试将docker映像推送到Amazon ECR注册表。我使用docker客户端docker版本1.9.1,构建a34a1d5。我使用aws ecr get-login -region 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用户具有正确的权限。我还确保存储库允许用户推送到它。为了确保这不是一个问题,我将注册表设置为允许所有用户完全访问。没有什么可以改变“no basic auth credentials”错误。我不知道如何开始调试,因为所有的流量都是加密的。

更新

So I had a bit of Homer Simpson D'Oh moment when I realized the root cause of my problem. I have access to multiple AWS accounts. Even though I was using aws configure to set my credentials for the account where I had setup my repository the aws cli was actually using the environment variables AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY. So when I did aws ecr get-login it was returning a login for the wrong account. I failed to notice that the account numbers were different until I just went back now to try some of the proposed answers. When I remove the environment variables everything works correctly. I guess the motto of the story is if you hit this error, make sure that the repository you are logging into matches the tag you have applied to the image.


当前回答

确保在aws ecr get-login中使用正确的区域,它必须与创建存储库的区域匹配。

其他回答

刚刚进行了更新,从AWS中删除了get-login,而是使用get-login-password:

sudo docker login -u AWS -p $(aws ecr get-login-password --region <region> - 
-profile <profile>) <account id>.dkr.ecr.eu-north-1.amazonaws.com 

如果使用默认凭证,不要忘记删除——profile标志

我遇到这个问题的原因不同:我需要推送到一个与我的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,这在回顾中是有意义的。解决方案是告诉aws ecr get-login您想登录到哪个注册中心。

$(aws ecr get-login --region us-west-2 --profile profilename --registry-ids {Client AWS ACCT #})

在那之后,docker push工作得很好。

只需运行第一步中返回的任何内容就可以解决问题。

Mac OSX

确保您的“auths”密钥与您的凭据存储密钥完全匹配

检查docker配置:

猫~ / .docker / json

结果:样本

{
    "auths": {
        "https://55511155511.dkr.ecr.us-east-1.amazonaws.com": {}
    },
    "HttpHeaders": {
        "User-Agent": "Docker-Client/19.03.5 (darwin)"
    },
    "credsStore": "osxkeychain"
}

注意,“auths”值是一个空对象,docker正在使用一个凭据存储“osxkeychain”。

打开Mac的“Keychain Access”应用程序,找到名称“Docker Credentials”

注意Where:字段

确保认证输入~/.docker/config。json匹配Keychain Access中的Where:字段。

如果认证者输入~/.docker/config. conf。在keychain中:字段,你可能会得到Login Succeeded from docker Login…但是仍然得到 错误:服务“web”未能构建:获得https://55511155511.dkr.ecr.us-east-1.amazonaws.com/v2/path/to/image/latest:没有基本的身份验证凭据,当你试图拉。

在我的例子中,我需要添加https://

原始

    "auths": {
        "55511155511.dkr.ecr.us-east-1.amazonaws.com": {}
    },

固定

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

我们今天也遇到了这个问题,并尝试了本文中提到的所有方法(除了生成AWS凭据)。

我们最终通过简单地升级Docker解决了这个问题,然后推送工作了。

Docker 1.10遇到了这个问题。Docker 1.11.x解决了这个问题。

希望这能有所帮助