Docker Python库无法正确登录到AWS ECR

时间:2019-02-15 06:21:37

标签: python amazon-web-services docker

我编写了一个Python脚本,将图像从AWS ECR拉到Ubuntu实例。在此实例上,我使用sudo运行docker命令,因为未将Docker设置为非root用户。

我在调用脚本时确实使用sudo。我发现的是,如果我当前先登录到AWS ECR,然后运行脚本,该脚本将按预期工作。但是,如果我没有登录,并且auth令牌已过期,看来docker login可以正常工作,但是当我尝试拉时,我收到一条消息,指示“存储库不存在或我需要'docker login '”。

检查日志,它使用

进行验证
  

2月15日06:00:38 Ubuntu-xenial dockerd [1388]:   time =“ 2019-02-15T06:00:38.832827449Z” level = error msg =“不继续   错误后出现拉动:拒绝:您的授权令牌已过期。   请运行“ aws ecr get-login --no-include-email”以获取一个新的密码。”

def log_into_aws_ecr(docker_client, region):
    # To do, set region
    ecr_client = boto3.client('ecr', region_name=region)

    # Get all repos
    response = ecr_client.describe_repositories()
    repo_names = []
    repositories = response.get('repositories', [])
    for repo in repositories:
        name = repo.get('repositoryName', '')
        if len(name):
            repo_names.append(name)
    token = ecr_client.get_authorization_token()
    username, password = base64.b64decode(token['authorizationData'][0]['authorizationToken']).decode('utf-8').split(":")
    registry_url = token['authorizationData'][0]['proxyEndpoint']
    login_results = docker_client.login(username, password, email='', registry=registry_url)

    prefix='https://'
    if registry_url.startswith(prefix):
        registry = registry_url[len(prefix):]
    else:
        registry = registry_url
    auth_config_payload = {'username': username, 'password': password }
    return ecr_client, repo_names, registry

请注意,此代码现在也正在重构,因此有一些已定义但当前未使用的变量。

通过行获取提供的docker_client

    docker_client = docker.from_env()

我尝试以

的身份运行

sudo -E ./myscript.py image

但这也不起作用。我有一个使用bash脚本的变体,效果很好。

docker_client.login的输出看起来像

  

正在查找“ ABCXYZ.dkr.ecr.us-west-2.amazonaws.com”的身份验证条目   找到了'ABCXYZ.dkr.ecr.us-west-2.amazonaws.com'

如果我转储响应,它看起来像这样。

  

{'password':'PASSWORD HERE','email':无,'username':'AWS',   'serveraddress':'ABCXYZ.dkr.ecr.us-west-2.amazonaws.com'}

2 个答案:

答案 0 :(得分:0)

get_authorization_token返回用户名和密码,但使用基本编码。参见https://github.com/aws/aws-cli/blob/develop/awscli/customizations/ecr.py#L53:L54

答案 1 :(得分:0)

好的,我不确定这是否完全正确,但是根据最近几天的一些实验,它确实可以工作。我也确实在docker-py GitHub存储库上发布了一个问题,但至少到目前为止,还没有人介入。

https://github.com/docker/docker-py/issues/2256

简而言之,我在链接中列出了以下内容:

好的,最近几天我进行了一些实验。不得不处理12小时的AWS ECR票,所以花了更长的时间。

似乎docker-py存在问题。

  

根据我的发现,我可以使用boto3或运行一个子流程   调用命令行到aws ecr。但是唯一的排列   似乎可以按照以下步骤进行操作。

     
      
  1. 使用子过程执行docker login。这将导致config.json文件被更新(不确定该文件是否包含   相关性)
  2.   
  3. 通过docker_client = docker.from_env()创建Docker客户端。我发现在子流程结果之前执行此操作不会   工作正常(除非您已经拥有有效的config.json
  4.   
  5. 然后致电docker_client.login(username=username, password=password, registry=registry_url)
  6.   
     

这是否可以预期,或者我是否正在做某事   错,我不知道。这是我想出的步骤   工作。