Cómo conectarse a AWS ECR con python docker-py

Cuando se ejecuta desde la línea de comandos, para extraer de un registro específico, puedo ejecutar estos 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

Si quiero un registro diferente, cambio la región o el nombre del perfil

Intentando esto con docker-py, tengo

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)

pero el dockerClient rechaza la conexión con:

nombre de usuario o contraseña incorrectos

A partir de ahí, una vez que funcione, querré usar un cliente docker pull/push para mover las imágenes entre registros.

¿Es la dirección correcta o debería intentar implementar esto por completo con scripts de shell? (Python ha sido especialmente valioso para las llamadas de boto para describir lo que hay en cada registro)

Ejemplo 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)

Y, por supuesto, primero debe configurar sus credenciales de AWS, p. ej.:

export AWS_ACCESS_KEY_ID=youraccesskeyexport AWS_SECRET_ACCESS_KEY=yoursecretaccesskey

Me he enfrentado al mismo problema, tienes que:

  1. decodificar desde base64

  2. convertir de byte a cadena

  3. separe el inicio de sesión 'AWS'

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

He encontrado que es más fácil pasar un auth_config con nombre de usuario/contraseña al enviar la imagen a 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 esto ayude a alguien!

Error de Inicio de Sesión

dockerClient rechaza la conexión con & quot;nombre de usuario o contraseña incorrectos"

La firma de la función a la que está llamando para iniciar sesión es:

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

Observe la posición de la registry parámetro. Es el cuarto en la lista. Así que tu llamada de:

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

Está pasando su registry como el email ya email es el tercer parámetro. Sugieren cambiar a algo como:

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

Python o shell?

¿Es la dirección correcta o debería intentar implementar esto por completo con scripts de shell? (Python ha sido especialmente valioso para las llamadas de boto para describir lo que hay en cada registro)

Ve con la pitón.

Hay un asunto abierto en el docker-py proyecto sobre esto, y una de sus soluciones funcionó para mí: despojar a los principales https:// desde el registro al realizar el inicio de sesión de Docker:

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

Esta es la respuesta que estás buscando: How to connect to AWS ECR using python docker-py - Server Fault