При запуске из командной строки для извлечения из определенного реестра я могу выполнить следующие команды:
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 для описания того, что находится в каждом реестре)
Katya
29.Апрель.2022 22:02:19
2
Полный пример кода, который работает:
#!/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
Я столкнулся с той же проблемой, вы должны:
декодирование из base64
преобразование из байта в строку
разделите логин "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://", "")
Igor_V
29.Апрель.2022 22:26:49
7