вход в систему через ECR через Python Docker SDK - PullRequest
0 голосов
/ 13 декабря 2018

python3 вместе с https://docker -py.readthedocs.io / en / stable /

Мне просто любопытно, что когда я вхожу в ecr (через aws ecr get-login) мой docker deamon на моем ПК запоминает токен, и даже если перезапустить оболочку, я могу войти в ECR, пока токен не истечет.Я даже вижу, что в файле ~ / .docker / config.json в ключе auths

Удивительно, но вход в SDK через Python Docker:

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 невежественнымпопытка входа.Когда я пытаюсь вытащить одно и то же изображение через командную строку - я получаю ошибку «no auth credentials».Что еще более странно, что когда я вхожу в ECR через командную строку, мне больше не нужно проходить аутентификацию с помощью скрипта python.

Есть идеи, почему это происходит?

1 Ответ

0 голосов
/ 17 мая 2019

Я также столкнулся с той же проблемой.Хотя у меня нет решения, у меня был обходной путь / альтернатива, с которым я успокоился.

В итоге я фактически симулировал выполнение команд в командной строке через 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

Я попытался покопаться в исходном коде докера, чтобы попытаться выяснить, почему это происходит, но ничего полезного из этого не получил: /

...