python - docker通过python docker SDK登录ECR

标签 python docker aws-ecr

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

我只是好奇,当我登录到 ecr(通过 aws ecr get-login)时,我 PC 上的 docker deamon 会记住 token ,即使重新启动 shell,我也可以登录到 ECR 直到 token 过期。我什至可以在 auths key 的 ~/.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 脚本进行身份验证。

知道为什么会这样吗?

最佳答案

我也遇到了同样的问题。虽然我没有解决方案,但我确实有一个让我满意的解决方法/替代方案。

我最终基本上是通过 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 源代码以弄清楚为什么会发生这种情况,但没有从中得到任何有用的信息:/

关于python - docker通过python docker SDK登录ECR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53759374/

相关文章:

docker - 运行Docker容器时如何附加到PATH环境变量?

networking - Docker Compose网络:nginx中的主机名无法解析

continuous-integration - Github 操作 : aws ecr login fails

Python在二进制中找到最大组合数

python - Pandas :如何计算组内的条件滚动/累积最大值

Python/Excel 自动化 - 从 2 个单元格到 1 个单元格的文本

docker - aws ecs中docker容器之间通过rabbitmq进行通信

python - Scipy fisher_exact 测试需要很长时间

python - 捕获在 docker 容器内运行的 python 脚本的输出

jenkins - 如何使用 Jenkins 将 Docker 容器从 Amazon ECR 自动部署到 Kubernetes