Извлечение изображения из ECR через docker-py - PullRequest
0 голосов
/ 27 июня 2018

У меня есть сценарий, который извлекает имя входа для ECR, аутентифицирует экземпляр DockerClient с учетными данными для входа в систему (значение по умолчанию - True), а затем пытается получить изображение назначенного контейнера.

Код, кажется, отлично работает при работе на моем локальном компьютере, взаимодействующем с демоном docker в экземпляре EC2, но при запуске из экземпляра EC2 я постоянно получаю

404 Client Error: Not Found ("repository XXXXXXXX.dkr.ecr.eu-west-2.amazonaws.com/autohld-runner not found: does not exist or no pull access")

Одно и то же хранилище используется как для локального, так и для удаленного выполнения кода на экземпляре EC2. Я попытался настроить доступ к изображению в ECR, чтобы обеспечить доступ для всех и моего идентификатора AWS. Я также предоставил роль, назначенную экземпляру EC2, полный доступ администратора. Все без радости.

Если я выполняю те же задачи на экземпляре EC2 через командную строку с точно таким же URI репо (скопированным из ошибки), это работает без проблем.

Есть ли что-то, чего мне не хватает в docker-py?

url = "tcp://127.0.0.1:2375"
dockerd = docker.DockerClient(base_url=url, version='auto')
dockerd.login(username=ecr.username, password=ecr.password, email='none', registry=ecr.registry, reauth=True)
dockerd.images.pull(ecr.get_repo(instance.tags['Container']), tag='latest')

get_repo возвращает полный URI, указанный в сообщении об ошибке, элементом Container является имя 'autohld-runner'

Спасибо

1 Ответ

0 голосов
/ 28 июня 2018

Похоже, что если к реестру обращались через cli, то устанавливается токен авторизации или что-то еще, и docker запоминает это, позволяя работать последующим вызовам. Однако в этом случае экземпляр запускается полностью заново и использует метод входа в систему в docker-py.

Кажется, это не передает учетные данные в пул, я обнаружил, что использование именованного аргумента auth_config и передача в словарь параметров аутентификации работает.

auth_creds = {'username': ecr.username, 'password': ecr.password}
dockerd.images.pull(ecr.get_repo(instance.tags['Container']), tag='latest', auth_config=auth_creds)

НТН

...