Docker Python 库无法正确登录 AWS ECR

Mob*_*Ben 3 python amazon-web-services docker

我编写了一个 Python 脚本来将映像从 AWS ECR 提取到 Ubuntu 实例。在此实例中,我运行 docker 命令,因为sudoDocker 未设置为非 root 用户。

sudo我在调用脚本时确实使用。我发现如果我当前先登录 AWS ECR 然后运行脚本,它会按预期工作。但是,如果我没有登录,并且身份验证令牌已过期,则似乎docker login可以工作,但是当我尝试拉取时,我收到一条消息,指示“存储库不存在或我需要'docker登录'”。

检查日志,它验证这一点

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
Run Code Online (Sandbox Code Playgroud)

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

提供的内容docker_client是通过线路获得的

    docker_client = docker.from_env()
Run Code Online (Sandbox Code Playgroud)

我尝试过运行

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”

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

{'密码':'此处密码','电子邮件':无,'用户名':'AWS','服务器地址':'ABCXYZ.dkr.ecr.us-west-2.amazonaws.com'}

Mob*_*Ben 5

好吧,我不太确定这是否完全正确,但是,根据过去几天的一些实验,它确实有效。我也在 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. 通过创建 docker 客户端docker_client = docker.from_env()。我发现在子流程之前执行此操作会导致它无法正常工作(除非您已经有一个有效的config.json
  3. 然后打电话docker_client.login(username=username, password=password, registry=registry_url)

我不知道这是否是预期的,或者我是否做错了什么。这就是我想出的有效步骤。