“授权令牌已过期”在MacOS Sierra上发布AWS-CLI

时间:2016-12-29 12:32:22

标签: amazon-web-services docker aws-cli macos-sierra

我正在尝试使用aws-cli将docker镜像推送到AWS ECR存储库。

  • 我只是运行get-login命令
  • 执行输出(返回login succeeded
  • 然后尝试推动泊坞窗图像然后我得到了 消息:
    denied: Your Authorization Token has expired. Please run 'aws ecr get-login' to fetch a new one.

我不知道哪里出错了,我正在向正确的仓库推进,我的Mac上的时间是正确的。 这之前有用,但是自从我重新安装我的mac并升级到macOS Sierra之后它就再也没用了,所以可能与此有关。

我的aws --version输出:

aws-cli/1.11.34 Python/2.7.10 Darwin/16.3.0 botocore/1.4.91

我运行的命令的完整输出:

$ aws ecr get-login --region eu-west-1
docker login -u AWS -p AQECAHh....b6Wk -e none https://1234567890.dkr.ecr.eu-west-1.amazonaws.com
$ docker login -u AWS -p AQECAHh....b6Wk -e none https://1234567890.dkr.ecr.eu-west-1.amazonaws.com
Flag --email has been deprecated, will be removed in 1.13.
Login Succeeded
$ docker push 1234567890.dkr.ecr.eu-west-1.amazonaws.com/service-web:latest
The push refers to a repository [1234567890.dkr.ecr.eu-west-1.amazonaws.com/service-web]
c1f87971dfa9: Preparing 
2eb644aea3de: Preparing 
9c8843ffe48e: Preparing 
39bb58d049d4: Preparing 
f053bc969599: Preparing 
7169084246b8: Waiting 
bb134a1936fd: Waiting 
184e76848a1c: Waiting 
75c8fcf65748: Waiting 
eb9b9ee1ea58: Waiting 
f4bf35723edd: Waiting 
ddffe1a64b3c: Waiting 
fd1a1154db16: Waiting 
b542e946067a: Waiting 
d49ed2a5e1ed: Waiting 
bb39b980367a: Waiting 
25b8358d062f: Waiting 
997eee521fc7: Waiting 
50b5447183a8: Waiting 
4339b5cb0e1d: Waiting 
3dbd4a53b21b: Waiting 
2bec16216500: Waiting 
b9fd8e264df6: Waiting 
b6ca02dfe5e6: Waiting 
denied: Your Authorization Token has expired. Please run 'aws ecr get-login' to fetch a new one.

27 个答案:

答案 0 :(得分:27)

上述两种解决方案都不适用于我,但我发现当我在ecr login命令中设置区域时,它可以正常工作。

aws ecr get-login --region us-west-2

答案 1 :(得分:18)

最新版本的Docker使用新的凭据存储功能has a bug使用指定协议的URL执行docker login将导致令牌过期错误。此问题将在Docker 1.13中修复。

目前,解决方法是在不指定协议的情况下执行登录命令。

所以在aws ecr get-login返回的命令blob中:

docker login -u AWS -p AQECAHh....b6Wk -e none https://1234567890.dkr.ecr.eu-west-1.amazonaws.com

应该替换为:

docker login -u AWS -p AQECAHh....b6Wk -e none 1234567890.dkr.ecr.eu-west-1.amazonaws.com

省略https://应该让docker暂时工作。

答案 2 :(得分:18)

您可能只是在运行该命令,而不是将该命令中的echo命令粘贴回终端。容易犯错误。运行后:

aws ecr get-login --no-include-email --region us-east-1

它将打印出另一个要运行的命令,您需要复制该命令并在终端中运行它以完全进行身份验证。

或者一个很酷的捷径就是将echo' d命令通过以下方式传回shell:
aws ecr get-login --no-include-email --region us-east-1 | sh

答案 3 :(得分:8)

简单命令:

password=$(aws ecr get-login-password --region us-east-1)
echo $password | docker login --username AWS --password-stdin 787566098823.dkr.ecr.us-east-1.amazonaws.com

答案 4 :(得分:5)

在使用AWS ECR的Linux Mint 18.1(Ubuntu 16.04)和最新的Python Docker client 2.5.1使用的最新Docker 17.06.1-ce上遇到了同样的问题。登录工作,推送失败。

删除~/.docker/config.json有帮助。它只包含可能陈旧的授权令牌。

我不认为它与底层操作系统有关。在我的情况下,它以前工作,我记得的唯一变化是从Ubuntu repo的docker.io 1.12升级到Docker repo的docker-ce 17.06

答案 5 :(得分:5)

您还收到消息"您的授权令牌已过期"如果你在〜/ .aws / credentials中有多个凭据(路径取决于你的操作系统)而忘记添加--p标志。

使用此命令登录:

aws ecr get-login --region eu-west-1 --p <yourprofilename>

答案 6 :(得分:4)

此答案对我来说适用于AWS CLI v2.0.26

https://github.com/aws/aws-cli/issues/4962#issuecomment-592064025

aws --region us-west-2 ecr get-login-password | docker login --username AWS --password-stdin xxxxxxxxxxxxxx.dkr.ecr.us-west-2.amazonaws.com

其中us-west-2是您的区域,而xxxxxxxxxxxxxx是您的帐户ID,位于以下“存储库名称”下面的行的开头:https://us-west-2.console.aws.amazon.com/ecr/create-repository?region=us-west-2

答案 7 :(得分:4)

以下步骤对我有用。首先,运行

aws ecr get-login --region us-west-2

您将获得一个输出,返回:

docker login -u AWS -p AQECAHh....b6Wk -e none 1234567890.dkr.ecr.eu-west-1.amazonaws.com

现在,从上述结果中删除“ -e none ”,然后再次运行命令。

您将能够成功登录。

现在,尝试推送您的docker镜像,它将起作用!

答案 8 :(得分:3)

You need to refresh your authorization token every 12 hours try:

$(aws ecr get-login --no-include-email --region us-east-1) - change region according to your configuration

答案 9 :(得分:2)

我也遇到了同样的错误,下面是我尝试的解决方案,它正在运行: 1.运行命令: aws ecr get-login --no-include-email --region ap-southeast-1(根据您的存储库更改区域) 2.你会得到类似的输出: docker login -u AWS -p xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx == https://youraccountid.dkr.ecr.ap-southeast-1.amazonaws.com

删除“https://”,然后运行命令 docker login -u AWS -p xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx == youraccountid.dkr.ecr.ap-southeast-1.amazonaws.com

它会起作用,你可以推动图像。

答案 10 :(得分:2)

我使用eval感到幸运。例如,

$ aws ecr get-login --region us-east-1 --no-include-email --profile username_env 

没用。

$ eval $(aws ecr get-login --region us-east-1 --no-include-email --profile username_env)

工作了。

答案 11 :(得分:2)

如果您selectRaw("count(gender_id) as count,CASE WHEN gender_id = 1 THEN 'Male' WHEN gender_id = 2 THEN 'Female' ELSE 'Unknown' END as gender")

,上述大多数解决方案将无法使用

对我来说,我有aws-cli/2.0.0

有用的是重新登录。 如果您在aws-cli/2.0.0 Python/3.8.1 Darwin/19.4.0 botocore/2.0.0dev4上,那么以下内容也可能适用。 aws-cli/2.0.0

答案 12 :(得分:1)

我使用稳定版的docker for mac Version 1.12

我刚刚升级到测试版Version 1.13.0-rc4-beta34.1 (14853) 现在一切正常。

因此,如果有相同问题的人,请确保使用docker for mac 1.13或更高版本,如果尚未发布1.13,请切换到测试版。

答案 13 :(得分:1)

我相信这是当前的格式,假设您正在尝试访问Docker:

Object

答案 14 :(得分:1)

在我的情况下,问题是〜/ .aws / credentails中的多个凭据,所以我使用了--profile

aws ecr get-login --no-include-email --region us-east-2 --profile xxxx

这对我有用。

答案 15 :(得分:1)

警告:aws ecr get-login似乎无法连接到AWS服务器,即使您有不良的AWS访问/密钥,或者您忘记输入AWS访问/密钥作为环境变量,它似乎也能正常工作。

它仍然会很高兴地为您提供长密码而不会出现错误。然后,您从AWS获得的消息是过期错误,而不是更正确和有用的“授权不正确”。

注意:使用aws-cli版本1.11.112。

答案 16 :(得分:0)

针对此特定错误的另一个解决方案变体是--registry-ids调用缺少aws ecr get-login参数。

完整的get-login调用类似于:

eval "$(aws ecr get-login --no-include-email \
  --region us-east-1 \
  --registry-ids 11223344 \
)"

请替换您自己的区域和注册表ID值。

答案 17 :(得分:0)

该问题提到login成功了,但docker push却失败了。

上述情况的两个可能原因是:

  1. AWS凭证已过期。转到AWS控制台或使用aws-cli生成新的一对。将它们存储在环境中或〜/ .aws / credentials文件中。
  2. 您可能使用了来自其他帐户的错误AWS凭证。使用存在ECR存储库的帐户凭证临时设置AWS_ACCESS_KEY,AWS_SECRET_ACCESS_KEY和AWS_REGION。
与帐户关联的

ECR存储库仅使用那些帐户的凭据

始终确保该操作使用了哪个AWS凭证。 检查环境变量并~/.aws/credentials进行确认。

答案 18 :(得分:0)

这对我有用。我在Windows上使用Docker。问题似乎出在docker配置上。特别是凭证的存储方式。如果您查看〜/ .docker / config.json,它可能看起来像这样:

{
        "auths": {
                "XXXX.dkr.ecr.us-east-1.amazonaws.com": {}
        },
        "HttpHeaders": {
                "User-Agent": "Docker-Client/19.03.5 (windows)"
        },
        "credsStore": "desktop",
        "stackOrchestrator": "swarm"
}

如果您删除credStore行,然后尝试再次登录

docker login -u AWS -p "XXX...the really long password ehre..XXX" https://XXXX.dkr.ecr.us-east-1.amazonaws.com

,您应该会看到类似

的内容
{
        "auths": {
                "XXXX.dkr.ecr.us-east-1.amazonaws.com": {
                        "auth": "XXX...the really long password ehre..XXX"
                }
        },
        "HttpHeaders": {
                "User-Agent": "Docker-Client/19.03.5 (windows)"
        },
        "stackOrchestrator": "swarm"
}

令人讨厌的是,我每次都必须这样做,因为docker再次添加了credStore

答案 19 :(得分:0)

我遇到此错误,因为我有多个配置文件。被标记的个人资料已为我解决:

$(aws ecr get-login --no-include-email --region us-west-2-个人资料 xxxx)

答案 20 :(得分:0)

问题是因为aws ecr get-login命令检索对指定注册表有效12个小时的令牌,然后打印带有该授权令牌的docker login命令,而我们没有执行我们得到的命令回来。

我们需要执行此打印命令以使用Docker登录到您的注册表。就我而言,我正在使用eval执行从aws ecr get-login返回的打印命令,如下所示:

eval $(aws ecr get-login --region eu-west-1 --profile)

答案 21 :(得分:0)

当我尝试从另一个AWS账户中的注册表中推/拉时发生了这种情况。我需要运行带有get-login标志的--registry-ids,并传入我要登录的注册表ID。

答案 22 :(得分:0)

在我的情况下,波纹管脚本适用于aws版本aws-cli / 2.0.8

    aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin ${aws_account_id}.dkr.ecr.${region}.amazonaws.com

答案 23 :(得分:0)

in似乎不再受支持。

我不得不改用aws ecr get-login

get-login-password

答案 24 :(得分:0)

我只想发布官方迁移链接,因为我相信如果情况发生变化,它将是最新的:

https://docs.aws.amazon.com/cli/latest/userguide/cliv2-migration.html#cliv2-migration-ecr-get-login

它说明

import time, threading
import datetime

def hold():

    start = time.time()
    
    while 1:

        print(datetime.datetime.now())
        
        # Sleep for 30 secs
        time.sleep(30)

        # Check if 1 hr over since the start of thread execution
        end = time.time()
        
        # Check if 1 hr passed
        if(end - start >= 3600):
            print(datetime.datetime.now())
            break



if __name__ == '__main__':
    
    # Initiating the thread
    thread1 = threading.Thread(target=hold)
    thread1.start()
    thread1.join()
    print("Thread execution complete")

应替换为

$(aws ecr get-login -no-include-email)

这是由于CLI中可能暴露密码。值得一提的是,您可以从CLI版本1.17.10迁移到新方法,以顺利迁移到2.X

答案 25 :(得分:0)

对于 AWS CLI 2.0,请使用以下内容

 aws ecr get-login-password \
    --region <region> \
| docker login \
    --username AWS \
    --password-stdin <aws_account_id>.dkr.ecr.<region>.amazonaws.com

来自https://docs.aws.amazon.com/cli/latest/reference/ecr/get-login-password.html

答案 26 :(得分:0)

我知道该帖子与MacOS Sierra有关,但对于那些在Windows上遇到问题的人,我执行了以下操作:

1) aws ecr get-login,此命令将输出一个长字符串

docker login -u AWS -p eyJwYXlsb2FkIjoiUXBnQ2FTV1B6Q1JqZGlH ..... 。(省略了整行以便更好地理解) -e none https://xxxxxxx.dkr.ecr.us-east-1.amazonaws.com

2)复制并粘贴上面一行(也许-e none赢了工作,所以也删除它)。输出将显示警告,然后成功: 警告!通过CLI使用--password是不安全的。使用--password-stdin 登录成功

如果您需要使用安全方式,请使用--password-stdin

3)现在您可以安全地推送图片了 -docker push xxxxxxx.dkr.ecr.us-east-1.amazonaws.com/ecfs-test

0429f33dd264: Pushed
48accfb13167: Pushed
f3bb6dd29c05: Pushed
e58ae65fa4eb: Pushed
3c6037fae296: Pushed
3efd1f7c01f6: Pushed
73b4683e66e8: Pushed
ee60293db08f: Pushed
9dc188d975fd: Pushed
58bcc73dcf40: Pushed
latest: digest: sha256:4354d137733c98a1bc8609d2d2f8e97316373904e size: 2404

也许这个解决方案也适用于Mac。