Como se conectar ao AWS ECR usando python docker-py

Ao executar a partir da linha de comando, para extrair de um registro específico, posso executar esses comandos:

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

Se eu quiser um registro diferente, altero a região ou o nome do perfil

Tentando isso com docker-py, eu tenho

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)

mas o dockerClient recusa a conexão com:

nome de usuário ou senha ruim

A partir daí, uma vez que esteja funcionando, vou querer usar um pull / push do cliente docker para mover as imagens entre os registros.

É a direção certa ou devo tentar implementar isso inteiramente com scripts de shell? (Python tem sido especialmente valioso para as chamadas boto para descrever o que está em cada registro)

Exemplo de código completo que funciona:

#!/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)

E é claro que você deve ter suas credenciais da AWS configuradas primeiro, por exemplo.:

export AWS_ACCESS_KEY_ID=youraccesskeyexport AWS_SECRET_ACCESS_KEY=yoursecretaccesskey

Eu enfrentei o mesmo problema, você tem que:

  1. descodificar a partir de base64

  2. converter de byte em string

  3. separe o login 'AWS'

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

Eu achei mais fácil passar um auth_config com nome de usuário / senha ao enviar a imagem para 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)

Espero que isso ajude alguém!

Falha No Login

dockerClient recusa a conexão com & quot;mau nome de usuário ou senha & quot;

A assinatura da função que você está chamando para fazer login é:

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

Observe a posição do registry parametro. É o quarto na lista. Então seu chamado de:

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

Está passando o seu registry como o email desde email é o terceiro parâmetro. Sugira que você mude para algo como:

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

Python ou shell?

É a direção certa ou devo tentar implementar isso inteiramente com scripts de shell? (Python tem sido especialmente valioso para as chamadas boto para descrever o que está em cada registro)

Vá com o Python.

Há um problema aberto no docker-py projeto sobre isso, e uma de suas soluções alternativas funcionou para mim-tirando a liderança https:// do registro ao executar o login do Docker:

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

Esta é a resposta que você está procurando: How to connect to AWS ECR using python docker-py - Server Fault