docker通过python docker SDK登录到ECR

时间:2018-12-13 10:07:13

标签: python docker aws-ecr

python3和https://docker-py.readthedocs.io/en/stable/

我很好奇,当我登录到ecr(通过aws ecr get-login)时,我在PC上的docker deamon会记住该令牌,即使重新启动shell,我也可以登录到ECR,直到令牌过期。我什至可以在auths键的〜/ .docker / config.json文件中看到它

令人惊讶的是,通过python docker SDK登录:

ecr_client = boto3.client('ecr')
    token = ecr_client.get_authorization_token()
    username, password = base64.b64decode(token['authorizationData'][0]['authorizationToken']).decode().split(':')
    registry = token['authorizationData'][0]['proxyEndpoint']

    docker_client.login(
        username=username,
        password=password,
        registry=registry
    )

    client.pull(...)

不考虑登录尝试就留下了我的docker守护进程。当我尝试通过命令行拉相同的图像时,出现错误“无身份验证凭据”。 更奇怪的是,当我通过命令行登录到ECR时,我不再需要通过python脚本进行身份验证。

知道为什么会这样吗?

2 个答案:

答案 0 :(得分:0)

我也遇到了同样的问题。尽管我没有解决方案,但确实有一个可以解决的变通方法/替代方法。

我最终通过Python在命令行上模拟了正在运行的命令。

import base64
import boto3
import docker
import subprocess32 as subprocess

docker_client = docker.from_env()

# this loads AWS access token and secret from env and returns an ECR client
ecr_client = boto3.client('ecr', region_name='your-region')


def login_docker_client_to_aws_ecr():
    token = ecr_client.get_authorization_token()
    username, password = base64.b64decode(token['authorizationData'][0]['authorizationToken']).decode().split(':')
    registry = token['authorizationData'][0]['proxyEndpoint']

    # loggin in via the docker sdk doesnt work so we're gonna go with this workaround
    command = 'docker login -u %s -p %s %s' % (username, password, registry)

    p = subprocess.Popen([command], stdout=subprocess.PIPE, shell=True, bufsize=1)
    for line in iter(p.stdout.readline, b''):
        print line
    p.communicate()  # close p.stdout, wait for the subprocess to exit

我试图深入研究docker源代码,以弄清为什么会发生这种情况,但并没有从中得到任何有用的信息:/

答案 1 :(得分:0)

docker-py项目中有一个open issue,他们的一种解决方法对我有用-在执行Docker登录时从注册表中删除开头的https://

registry_url = token['authorizationData'][0]['proxyEndpoint'].replace("https://", "")