Как подключиться к AWS ECR с помощью python docker-py

При запуске из командной строки для извлечения из определенного реестра я могу выполнить следующие команды:

dockerCommand=$("aws ecr get-login --profile profileName --region us-west-2")$dockerCommand  (which looks like docker login -u AWS -p ..longPassword.. -e none https://ACCTID.dkr.ecr.us-west-2.amazonaws.comdocker pull ACCTID.dkr.ecr.us-west-2.amazonaws.com/REPO/NAME:TAGNAME

Если мне нужен другой реестр, я меняю регион или имя профиля

Пытаясь сделать это с помощью docker-py, у меня есть

import boto3import dockerdockerClient = docker.from_env()session = boto3.setup_default_session(profile_name='vzw')client = session.client('ecr', region_name='us-west-2')token = client.get_authorization_token(registryIds=[registryId])username = 'AWS'password = token['authorizationData'][0]['authorizationToken']registry = token['authorizationData'][0]['proxyEndpoint']regClient = dockerClient.login(username, password, registry)

но в dockerClient отказывается от соединения с:

неверное имя пользователя или пароль

Оттуда, как только это заработает, я захочу использовать pull / push клиента docker для перемещения изображений между реестрами.

Это правильное направление или я должен пытаться реализовать это полностью с помощью сценариев оболочки? (Python был особенно ценен для вызовов boto для описания того, что находится в каждом реестре)

Полный пример кода, который работает:

#!/usr/bin/env python3import base64, docker, boto3docker_client = docker.from_env(version='1.24')ecr_client = boto3.client('ecr', region_name='eu-west-1')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, password, registry=registry)

И, конечно же, сначала вам следует настроить свои учетные данные AWS, например:

export AWS_ACCESS_KEY_ID=youraccesskeyexport AWS_SECRET_ACCESS_KEY=yoursecretaccesskey

Я столкнулся с той же проблемой, вы должны:

  1. декодирование из base64

  2. преобразование из байта в строку

  3. разделите логин "AWS"

     password = (base64.b64decode(response['authorizationData'][0]['authorizationToken'])).decode("utf-8").split(':')[-1]

Я обнаружил, что проще всего передать auth_config с именем пользователя / паролем при отправке изображения в ECR.

import boto3import base64import dockersess = boto3.Session()resp = sess.client('ecr').get_authorization_token()token = resp['authorizationData'][0]['authorizationToken']token = base64.b64decode(token).decode()username, password = token.split(':')auth_config = {'username': username, 'password': password}# get local docker clientclient = docker.from_env()# build/tag image here....# then override the docker client config by passing auth_configclient.image.push(<image name>, auth_config=auth_config)

Надеюсь, это кому-то поможет!

Сбой входа в систему

dockerClient отказывается от соединения с "неправильным именем пользователя или паролем";

Сигнатура функции, которую вы вызываете для входа в систему, является:

def login(self, username, password=None, email=None, registry=None,          reauth=False, insecure_registry=False, dockercfg_path=None):

Обратите внимание на положение registry параметр. Он занимает четвертое место в списке. Так что ваш призыв к:

regClient = dockerClient.login(username, password, registry)

Проходит мимо вашего registry в качестве email с email это третий параметр. Предлагаю вам перейти на что-то вроде:

regClient = dockerClient.login(username, password, registry=registry)

Python или shell?

Это правильное направление или я должен пытаться реализовать это полностью с помощью сценариев оболочки? (Python был особенно ценен для вызовов boto для описания того, что находится в каждом реестре)

Иди с Питоном.

Там есть открытый вопрос в docker-py проект об этом, и один из их обходных путей сработал для меня - лишение ведущего https:// из реестра при выполнении входа в Docker:

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

Это тот ответ, который вы ищете: How to connect to AWS ECR using python docker-py - Server Fault