Como se conectar ao AWS ECR usando o python docker-py

4

Ao executar a partir da linha de comando, para puxar de um registro específico, posso executar estes 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.com
docker pull ACCTID.dkr.ecr.us-west-2.amazonaws.com/REPO/NAME:TAGNAME

Se eu quiser um registro diferente, altero a região ou o profileName

Tentando isso com o docker-py, tenho

import boto3
import docker
dockerClient = 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:

bad username or password

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

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

    
por efreedom 18.06.2017 / 16:37

3 respostas

3

Falha no login

dockerClient refuses the connection with "bad username or password"

A assinatura da função para a qual você está ligando é:

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

Observe a posição do parâmetro registry . É o quarto da lista. Então, sua chamada de:

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

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

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

Python ou shell?

Is the the right direction or should I be trying to implement this entirely with shell scripts? (Python has been especially valuable for the boto calls to describe what is in each registry)

Vá com o Python.

    
por 18.06.2017 / 17:34
4

Eu enfrentei o mesmo problema, você tem que:

  1. decodificar a partir de base64
  2. converter de byte para string
  3. separe o login "AWS"

    password = (base64.b64decode(response['authorizationData'[0]authorizationToken'])).decode("utf-8").split(":")[-1]
    
por 15.11.2017 / 09:41
2

Exemplo de código completo que funciona:

#!/usr/bin/env python3
import base64, docker, boto3

docker_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, você deve ter suas credenciais da AWS configuradas primeiro, por exemplo:

export AWS_ACCESS_KEY_ID=youraccesskey
export AWS_SECRET_ACCCESS_KEY=yoursecretaccesskey
    
por 04.05.2018 / 13:57