पायथन डॉकर-पीई का उपयोग करके एडब्ल्यूएस ईसीआर से कैसे कनेक्ट करें

कमांड लाइन से चलते समय, एक विशिष्ट रजिस्ट्री से खींचने के लिए मैं इन आदेशों को चला सकता हूं:

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. समझाना से base64

  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