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
Ollie
May 3, 2022, 5:04pm
#3
Me he enfrentado al mismo problema, tienes que:
decodificar desde base64
convertir de byte a cadena
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!
Ray
May 3, 2022, 5:15pm
#5
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://", "")