Docker Python API – Contenedores de labeldo

Estoy usando Docker con el informe de AWS ECR. Uno de los pasos que le indican que debe hacer es ejecutar la "label del acoplador" para labelr una image construida con una label que incluya una location "totalmente calificada" donde se almacenará la image en el ECR.

Estaba trabajando en la migration de un script que tenía a la API de Python (en lugar de hacer llamadas de shell al cliente de Docker). No puedo encontrar el equivalente de "label de portador" en los documentos de API en https://docker-py.readthedocs.io/en/stable/images.html .

¿Puede alguien señalarme en la dirección correcta?

Estos son los pasos que puede seguir para crear y labelr una image.

 import docker tag = 'latest' # or whatever you want client = docker.from_env() # identifier of the image on your system dockername = "%s:%s" % (<name of the image on your system>, <tag>) # the target identifier target = "%s:%d/%s" % (<registry address>, <registry_port>, <id or name of the image>) # the url is usually unix://var/run/docker.sock' but depends on your environment cli = docker.APIClient(base_url=<the daemon\'s url or socket>) # build the image cli.build(path=..., tag=dockername, pull=..., buildargs=...) # tag it image = client.images.get(dockername) image.tag(target, tag=tag) 

Para aquellos de ustedes que usan ECR / ECS en AWS, aquí hay un ejemplo de cómo hacerlo.

Amazon proporciona instrucciones como esta en ECR para enviar sus imágenes:

 aws ecr get-login --no-include-email --region us-west-2 docker build -t myproj . docker tag calclab:latest XXXXXXXXXX.dkr.ecr.us-west-2.amazonaws.com/myproj:latest docker push XXXXXXXXXX.dkr.ecr.us-west-2.amazonaws.com/myproj:latest 

Aquí está el equivalente aproximado usando Docker Python API y Boto (biblioteca de Python de AWS). Incluye labelr la image dos veces en ECR, de modo que pueda rastrear el número de versión de cada image mientras sigo el último (de modo que mi tarea ECS puede, de forma pnetworkingeterminada, tomar siempre la image más reciente)

 import docker import boto3 def ecrDemo(version_number): # The ECR Repository URI repo = XXXXXXXXXX.dkr.ecr.us-west-2.amazonaws.com/myproj # The name of the [profile] stonetworking in .aws/cnetworkingentials profile = "sandbox" # The region your ECR repo is in region = "us-west-2" # How you want to tag your project locally local_tag = "myproj" #Set up a session session = boto3.Session(profile_name=profile, region_name=region) ecr = session.client('ecr') docker_api = docker.APIClient() print "Building image " + local_tag for line in docker_api.build(path='.', tag=local_tag, stream=True, \ dockerfile='./Dockerfile.myproj'): process_docker_api_line(line) # Make auth call and parse out results auth = ecr.get_authorization_token() token = auth["authorizationData"][0]["authorizationToken"] username, password = b64decode(token).split(':') endpoint = auth["authorizationData"][0]["proxyEndpoint"] # print "Make authentication call" # docker_api.login(username=user, password=password, \ # registry=endpoint, reauth=True) auth_config_payload = {'username': username, 'password': password} version_tag = repo + ':latest' latest_tag = repo + ':' + version_number print "Tagging version " + version_tag if docker_api.tag(local_tag, version_tag) is False: raise RuntimeError("Tag appeanetworking to fail: " + version_tag) print "Tagging latest " + latest_tag if docker_api.tag(local_tag, latest_tag) is False: raise RuntimeError("Tag appeanetworking to fail: " + tag_latest) print "Pushing to repo " + version_tag for line in docker_api.push(version_tag, stream=True, auth_config=auth_config_payload): self.process_docker_api_line(line) print "Pushing to repo " + latest_tag for line in docker_api.push(latest_tag, stream=True, auth_config=auth_config_payload): self.process_docker_api_line(line) print "Removing taged deployment images" # You will still have the local_tag image if you need to troubleshoot docker_api.remove_image(version_tag, force=True) docker_api.remove_image(latest_tag, force=True) def process_docker_api_line(payload): """ Process the output from API stream, throw an Exception if there is an error """ # Sometimes Docker sends to "{}\n" blocks together... for segment in payload.split('\n'): line = segment.strip() if line: try: line_payload = json.loads(line) except ValueError as ex: print "Could not decipher payload from API: " + ex.message if line_payload: if "errorDetail" in line_payload: error = line_payload["errorDetail"] sys.stderr.write(error["message"]) raise RuntimeError("Error on build - code " + `error["code"]`) elif "stream" in line_payload: sys.stdout.write(line_payload["stream"])