كيفية الاتصال أوس إكر باستخدام بيثون دوكر-بي

عند تشغيل من سطر الأوامر ، لسحب من سجل معين يمكنني تشغيل هذه الأوامر:

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

إذا كنت أريد سجلا مختلفا ، فأقوم بتغيير المنطقة أو اسم الملف الشخصي

تحاول هذا مع عامل الميناء-الحمر ، لدي

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)

لكن ال dockerClient يرفض الاتصال مع:

اسم مستخدم أو كلمة مرور سيئة

من هناك ، بمجرد أن يعمل ذلك ، سأرغب في استخدام سحب/دفع عميل عامل الميناء لنقل الصور بين السجلات.

هو الاتجاه الصحيح أو ينبغي أن أحاول تنفيذ هذا تماما مع البرامج النصية قذيفة? (كان بيثون قيمة خاصة للمكالمات بوتو لوصف ما هو في كل التسجيل)

مثال رمز كامل يعمل:

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

وبالطبع يجب أن يكون لديك أوراق اعتماد أوس الخاصة بك أولا ، على سبيل المثال.:

export AWS_ACCESS_KEY_ID=youraccesskeyexport AWS_SECRET_ACCESS_KEY=yoursecretaccesskey

لقد واجهت نفس المشكلة ، عليك أن:

  1. فك الشفرة من القاعدة 64

  2. تحويل من بايت إلى سلسلة

  3. فصل تسجيل الدخول 'أوس'

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

لقد وجدت أنه من الأسهل لتمرير auth_config مع اسم المستخدم / كلمة المرور عند دفع الصورة إلى إكر.

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)

آمل أن يساعد هذا شخص ما!

فشل تسجيل الدخول

دوكركلينت يرفض الاتصال باسم المستخدم أو كلمة المرور السيئة;

توقيع الوظيفة التي تتصل بها لتسجيل الدخول هو:

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

لاحظ موقف registry المعلمة. هو الرابع في القائمة. لذلك دعوتكم من:

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

يمر بك registry كما email منذ email هي المعلمة الثالثة. أقترح عليك التغيير إلى شيء مثل:

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

بيثون أو شل?

هو الاتجاه الصحيح أو ينبغي أن أحاول تنفيذ هذا تماما مع البرامج النصية قذيفة? (كان بيثون قيمة خاصة للمكالمات بوتو لوصف ما هو في كل التسجيل)

الذهاب مع الثعبان.

هناك قضية مفتوحة في ال docker-py مشروع حول هذا الموضوع ، وعملت واحدة من الحلول بالنسبة لي-تجريد الرائدة https:// من التسجيل عند إجراء تسجيل دخول عامل الميناء:

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

هذا هو الجواب الذي تبحث عنه: How to connect to AWS ECR using python docker-py - Server Fault