Вытягивание изображения из ECR через docker-py

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

Код, кажется, отлично работает при работе на моей локальной машине, взаимодействующей с демоном докеров в экземпляре 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.

Спасибо


person Graeme    schedule 27.06.2018    source источник


Ответы (1)


Кажется, что если доступ к реестру был получен через cli, то установлен токен авторизации или что-то еще, и докер запоминает это, позволяя работать последующим вызовам. Однако в этом случае экземпляр запускается совершенно заново и использует метод входа в систему в 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)

ХТН

person Graeme    schedule 28.06.2018