Cara terhubung ke AWS ECR menggunakan python docker-py

Saat menjalankan dari baris perintah, untuk menarik dari registri tertentu saya dapat menjalankan perintah ini:

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

Jika saya ingin registri yang berbeda, saya mengubah wilayah atau nama profil

Mencoba ini dengan docker-py, Saya Punya

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)

tapi dockerClient menolak koneksi dengan:

nama pengguna atau kata sandi buruk

Dari sana, setelah itu berfungsi, saya ingin menggunakan Tarik/Dorong klien buruh pelabuhan untuk memindahkan gambar di antara pendaftar.

Apakah arah yang benar atau haruskah saya mencoba menerapkan ini sepenuhnya dengan skrip shell? (Python sangat berharga untuk panggilan boto untuk menggambarkan apa yang ada di setiap registri)

Contoh kode lengkap yang berfungsi:

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

Dan tentu saja Anda harus menyiapkan kredensial AWS Anda terlebih dahulu, mis.:

export AWS_ACCESS_KEY_ID=youraccesskeyexport AWS_SECRET_ACCESS_KEY=yoursecretaccesskey

Saya telah menghadapi masalah yang sama, Anda harus:

  1. decode dari base64

  2. konversi dari byte ke string

  3. pisahkan login 'AWS'

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

Saya telah menemukan untuk menjadi termudah untuk lulus auth_config dengan nama pengguna / kata sandi saat mendorong gambar ke 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)

Semoga ini bisa membantu seseorang!

Login Gagal

dockerClient menolak koneksi dengan & quot;Nama Pengguna atau kata sandi yang buruk"

Tanda tangan dari fungsi yang Anda panggil untuk login adalah:

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

Perhatikan posisi registry parameter. Ini adalah keempat dalam daftar. Jadi panggilan Anda:

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

Apakah melewati Anda registry sebagai email sejak email adalah parameter ketiga. Sarankan Anda mengubah sesuatu seperti:

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

Python atau shell?

Apakah arah yang benar atau haruskah saya mencoba menerapkan ini sepenuhnya dengan skrip shell? (Python sangat berharga untuk panggilan boto untuk menggambarkan apa yang ada di setiap registri)

Pergi dengan Python.

Ada sebuah masalah terbuka dalam docker-py proyek tentang ini, dan salah satu solusi mereka berhasil untuk saya-melucuti yang terdepan https:// dari registri saat melakukan login Docker:

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

Ini adalah jawaban yang Anda cari: How to connect to AWS ECR using python docker-py - Server Fault