Библиотека Docker Python не может правильно войти в AWS ECR - PullRequest
0 голосов
/ 15 февраля 2019

Я написал скрипт Python для извлечения изображений из AWS ECR в экземпляр Ubuntu.В этом случае я запускаю команды docker с sudo, поскольку Docker не настроен как пользователь без полномочий root.

Я использую sudo при вызове сценария.Я обнаружил, что если я в данный момент вошел в AWS ECR, а затем запустил скрипт, он работает, как и ожидалось.Тем не менее, если я не вошел в систему, и токен аутентификации истек, кажется, что docker login работает, но когда я пытаюсь и тяну, я получаю сообщение, указывающее, что «хранилище не существует, или мне требуется« вход в Docker »».

Изучая журналы, он проверяет это с помощью

15 февраля 06:00:38 ubuntu-xenial dockerd [1388]: time = "2019-02-15T06: 00: 38.832827449Z "level = error msg =" Не продолжается pull после ошибки: отказано: срок действия вашего токена авторизации истек. Запустите '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 получен черезline

    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': 'ПАРОЛЬ ЗДЕСЬ', 'email': нет, 'username': 'AWS', 'serveraddress': 'ABCXYZ.dkr.ecr.us-west-2.amazonaws.com '}

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Хорошо, я не совсем уверен, если это полностью правильно, однако, основываясь на некоторых экспериментах за последние несколько дней, это работает.Я также открыл проблему с репозиторием GitHub на Docker-py, но, по крайней мере, на данный момент никто не вмешался.

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)

Независимо от того,это ожидаемо или нет, или если я делаю что-то не так, я не знаю. Это то, что я придумал как шаги, которые работают.

0 голосов
/ 15 февраля 2019

get_authorization_token возвращает имя пользователя и пароль, но они закодированы.Смотри https://github.com/aws/aws-cli/blob/develop/awscli/customizations/ecr.py#L53:L54

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...