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)
Skylar
April 28, 2022, 11:55pm
#2
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:
descodificar a partir de base64
converter de byte em string
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.
Harley
April 29, 2022, 12:14am
#6
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://", "")
Ray
April 29, 2022, 12:19am
#7