Identificación automática de las imágenes de contenedor duplicadas al migrar a un repositorio de Amazon ECR - Recomendaciones de AWS

Identificación automática de las imágenes de contenedor duplicadas al migrar a un repositorio de Amazon ECR

Rishabh Yadav y Rishi Singla, Amazon Web Services

Resumen

Aviso: AWS CodeCommit ya no está disponible para los nuevos clientes. Los clientes existentes de AWS CodeCommit pueden seguir utilizando el servicio con normalidad. Más información

El patrón proporciona una solución automatizada para identificar si las imágenes almacenadas en diferentes repositorios de contenedores son duplicadas. Esta comprobación resulta útil si planea migrar imágenes de otros repositorios de contenedor a Amazon Elastic Container Registry (Amazon ECR).

Para obtener información básica, el patrón también describe los componentes de una imagen de contenedor, como el resumen de la imagen, el manifiesto y las etiquetas. Cuando planifique una migración a Amazon ECR, puede decidir sincronizar las imágenes de los contenedores entre los registros de contenedores comparando los resúmenes de las imágenes. Antes de migrar las imágenes de contenedor, debe comprobar si estas imágenes ya existen en el repositorio de Amazon ECR para evitar la duplicación. Sin embargo, puede resultar difícil detectar la duplicación comparando los resúmenes de imágenes, y esto podría provocar problemas en la fase inicial de migración.  Este patrón compara los resúmenes de dos imágenes similares que están almacenadas en diferentes registros de contenedores y explica por qué varían los resúmenes con el fin de ayudarle a comparar las imágenes con precisión.

Requisitos previos y limitaciones

Arquitectura

Componentes de la imagen de contenedor

En el siguiente diagrama se ilustran algunos de los componentes de una imagen de contenedor. Estos componentes se describen después del diagrama.

Manifiesto, configuración, capas del sistema de archivos y resúmenes.

Términos y definiciones

Los siguientes términos se definen en la especificación de imagen de la Open Container Initiative (OCI).

  • Registro: servicio de almacenamiento y administración de imágenes.

  • Cliente: herramienta que se comunica con los registros y funciona con imágenes locales.

  • Inserción: proceso para cargar imágenes a un registro.

  • Extracción: proceso de descarga de imágenes de un registro.

  • Blob: formato binario de contenido que almacena un registro y al que se puede acceder mediante un resumen.

  • Índice: constructo que identifica varios manifiestos de imágenes para distintos tipos de plataformas informáticas (como x86-64 o ARM de 64 bits) o contenido multimedia. Para obtener más información, consulte la especificación del índice de imágenes de OCI.

  • Manifiesto: documento JSON que define una imagen o un artefacto que se carga a través del punto de conexión del manifiesto. Un manifiesto puede hacer referencia a otros blobs de un repositorio mediante descriptores. Para obtener más información, consulte la especificación del manifiesto de imágenes de OCI.

  • Capa del sistema de archivos: bibliotecas del sistema y otras dependencias de una imagen.

  • Configuración: un blob que contiene metadatos de artefactos y al que se hace referencia en el manifiesto. Para obtener más información, consulte la especificación de la configuración de imágenes de OCI.

  • Objeto o artefacto: elemento de contenido conceptual que se almacena como un blob y se asocia a un manifiesto adjunto con una configuración.

  • Resumen: identificador único que se crea a partir de un hash criptográfico del contenido de un manifiesto. El resumen de imágenes ayuda a identificar de forma única una imagen de contenedor inmutable. Al extraer una imagen mediante su resumen, descargará siempre la misma imagen en cualquier sistema operativo o arquitectura. Para obtener más información, consulte la especificación de imágenes de OCI.

  • Etiqueta: un identificador de manifiesto legible para los humanos. En comparación con los resúmenes de imágenes, que son inmutables, las etiquetas son dinámicas. Una etiqueta que apunta a una imagen puede cambiar y pasar de una imagen a otra, aunque el resumen de la imagen subyacente sigue siendo el mismo.

Arquitectura de destino

El siguiente diagrama muestra la arquitectura de alto nivel de la solución proporcionada por este patrón para identificar imágenes de contenedor duplicadas mediante la comparación de las imágenes almacenadas en Amazon ECR y en repositorios privados.

Detecte duplicados automáticamente con CodePipeline y CodeBuild.

Herramientas

Servicios de AWS

  • CloudFormation ayuda a configurar los recursos de AWS, aprovisionarlos de manera rápida y coherente y administrarlos durante todo su ciclo de vida en las regiones y Cuentas de AWS.

  • AWS CodeBuild es un servicio de compilación completamente administrado que le permite compilar código fuente, poner en marcha pruebas unitarias y producir artefactos listos para implementar.

  • AWS CodeCommit es un servicio de control de versiones que permite almacenar y administrar repositorios de Git de forma privada, sin necesidad de administrar su propio sistema de control de origen.

  • AWS CodePipeline permite diseñar y configurar rápidamente las diferentes etapas de un proceso de lanzamiento de software y automatizar los pasos necesarios para lanzar los cambios en el software de manera continua.

  • Amazon Elastic Container Registry (Amazon ECR) es un servicio de registro de imágenes de contenedor administrado que es seguro, escalable y fiable.

Código de

El código de este patrón está disponible en la solución automatizada del repositorio de GitHub para identificar imágenes de contenedor duplicadas entre repositorios.

Prácticas recomendadas

Epics

TareaDescripciónHabilidades requeridas

Extraiga una imagen de un repositorio público de Amazon ECR.

Desde el terminal, ejecute el siguiente comando para extraer la imagen amazonlinux del repositorio público de Amazon ECR.

$~ % docker pull public.ecr.aws/amazonlinux/amazonlinux:2018.03

Cuando la imagen se haya trasladado a su máquina local, verá el siguiente resumen de extracción, que representa el índice de la imagen.

2018.03: Pulling from amazonlinux/amazonlinux 4ddc0f8d367f: Pull complete Digest: sha256:f972d24199508c52de7ad37a298bda35d8a1bd7df158149b381c03f6c6e363b5 Status: Downloaded newer image for public.ecr.aws/amazonlinux/amazonlinux:2018.03 public.ecr.aws/amazonlinux/amazonlinux:2018.03
Desarrollador de aplicaciones, DevOps de AWS, administrador de AWS

Inserte la imagen en un repositorio privado de Amazon ECR

  1. Cree un repositorio privado de Amazon ECR denominado test_ecr_repository en la región Este de EE. UU. (Norte de Virginia) (us-east-1).

    $~ % aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin <account-id>.dkr.ecr.us-east-1.amazonaws.com Login Succeeded

    donde <account-id> se refiere a su Cuenta de AWS.

  2. Etiquete la imagen local que extrajo anteriormente. Use el valor public.ecr.aws/amazonlinux/amazonlinux:2018.03 e insértelo en un repositorio privado de Amazon ECR.

    $~ % docker tag public.ecr.aws/amazonlinux/amazonlinux:2018.03 <account-id>.dkr.ecr.us-east-1.amazonaws.com/test_ecr_repository:latest $~ % docker push <account-id>.dkr.ecr.us-east-1.amazonaws.com/test_ecr_repository:latest

    Cuando inserte la imagen en el repositorio de Amazon ECR, Docker insertará la imagen subyacente y no el índice de la imagen.

    The push refers to repository [<account-id>.dkr.ecr.us-east-1.amazonaws.com/test_ecr_repository] d5655967c2c4: Pushed latest: digest: sha256:52db9000073d93b9bdee6a7246a68c35a741aaade05a8f4febba0bf795cdac02 size: 529
Administrador de AWS, DevOps de AWS, desarrollador de aplicaciones

Extraiga la misma imagen del repositorio privado de Amazon ECR.

  1. Desde el terminal, ejecute el siguiente comando para extraer la imagen que ha insertado anteriormente en el repositorio privado de Amazon ECR.

    $~ % docker pull <account-id>.dkr.ecr.us-east-1.amazonaws.com/test_ecr_repository:latest latest: Pulling from test_ecr_repository Digest: sha256:52db9000073d93b9bdee6a7246a68c35a741aaade05a8f4febba0bf795cdac02 Status: Image is up to date for <account-id>.dkr.ecr.us-east-1.amazonaws.com/test_ecr_repository:latest <account-id>.dkr.ecr.us-east-1.amazonaws.com/test_ecr_repository:latest

    El resumen de esta imagen coincide con el resumen de la imagen que ha enviado al repositorio privado de Amazon ECR y representa la imagen subyacente. Este valor no coincide con el índice de imágenes que ha extraído del repositorio público.

  2. Para verificarlo, recupere el índice de imágenes por resumen. 

    curl -k -H "Authorization: Bearer $TOKEN" https://public.ecr.aws/v2/amazonlinux/amazonlinux/manifests/sha256:f972d24199508c52de7ad37a298bda35d8a1bd7df158149b381c03f6c6e363b55 { "schemaVersion": 2, "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json", "manifests": [ { "mediaType": "application/vnd.docker.distribution.manifest.v2+json", "size": 529, "digest": "sha256:52db9000073d93b9bdee6a7246a68c35a741aaade05a8f4febba0bf795cdac02", "platform": { "architecture": "amd64", "os": "linux" } } ] }
Desarrollador de aplicaciones, DevOps de AWS, administrador de AWS
TareaDescripciónHabilidades requeridas

Busque el manifiesto de la imagen almacenada en el repositorio público de Amazon ECR.

Desde el terminal, ejecute el siguiente comando para extraer el manifiesto de la imagen public.ecr.aws/amazonlinux/amazonlinux:2018.03 del repositorio público de Amazon ECR.

$~ % docker manifest inspect public.ecr.aws/amazonlinux/amazonlinux:2018.03 { "schemaVersion": 2, "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json", "manifests": [ { "mediaType": "application/vnd.docker.distribution.manifest.v2+json", "size": 529, "digest": "sha256:52db9000073d93b9bdee6a7246a68c35a741aaade05a8f4febba0bf795cdac02", "platform": { "architecture": "amd64", "os": "linux" } } ] }
Administrador de AWS, DevOps de AWS, desarrollador de aplicaciones

Busque el manifiesto de la imagen almacenada en el repositorio privado de Amazon ECR.

Desde el terminal, ejecute el siguiente comando para extraer el manifiesto de la imagen <account-id>.dkr.ecr.us-east-1.amazonaws.com/test_ecr_repository:latest del repositorio privado de Amazon ECR.

$~ % docker manifest inspect <account-id>.dkr.ecr.us-east-1.amazonaws.com/test_ecr_repository:latest { "schemaVersion": 2, "mediaType": "application/vnd.docker.distribution.manifest.v2+json", "config": { "mediaType": "application/vnd.docker.container.image.v1+json", "size": 1477, "digest": "sha256:f7cee5e1af28ad4e147589c474d399b12d9b551ef4c3e11e02d982fce5eebc68" }, "layers": [ { "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip", "size": 62267075, "digest": "sha256:4ddc0f8d367f424871a060e2067749f32bd36a91085e714dcb159952f2d71453" } ] }
Desarrollador de aplicaciones, DevOps de AWS, administrador de sistemas AWS

Compare el resumen extraído por Docker con el resumen del manifiesto de la imagen en el repositorio privado de Amazon ECR.

Otra pregunta es por qué el resumen proporcionado por el comando docker pull difiere del resumen del manifiesto de la imagen <account-id>.dkr.ecr.us-east-1.amazonaws.com/test_ecr_repository:latest.

El resumen utilizado para docker pull representa el resumen del manifiesto de la imagen, que se almacena en un registro. Este resumen se considera la raíz de una cadena de hash, porque el manifiesto contiene el hash del contenido que se descargará e importará a Docker.

El ID de imagen utilizado en Docker se encuentra en este manifiesto como config.digest. Representa la configuración de imagen que usa Docker. Por lo tanto, se podría decir que el manifiesto es el sobre y la imagen es el contenido del sobre. El resumen del manifiesto siempre es diferente del ID de la imagen. Sin embargo, un manifiesto específico siempre debe producir el mismo ID de imagen. Como el resumen del manifiesto es una cadena de hash, no podemos garantizar que siempre sea igual para un ID de imagen determinado. En la mayoría de los casos, produce el mismo resumen, aunque Docker no puede garantizarlo. La posible diferencia en el resumen del manifiesto se debe a que Docker no almacena localmente los blobs comprimidos con gzip. Por lo tanto, la exportación de capas puede producir un resumen diferente, aunque el contenido sin comprimir siga siendo el mismo. El ID de imagen comprueba que el contenido sin comprimir es el mismo; es decir, el ID de imagen es ahora un identificador de contenido direccionable (chainID).

Para confirmar esta información, puede comparar el resultado del comando docker inspect en los repositorios públicos y privados de Amazon ECR:

  1. Ejecute el siguiente comando desde el terminal para la imagen almacenada en el repositorio público de Amazon ECR.

    $~ % docker inspect public.ecr.aws/amazonlinux/amazonlinux:2018.03

    Para ver un ejemplo de comando, consulte la sección Información adicional.

  2. Ejecute el siguiente comando desde el terminal para la imagen almacenada en el repositorio privado de Amazon ECR.

    $~ % docker inspect <account-id>.dkr.ecr.us-east-1.amazonaws.com/test_ecr_repository:latest

    Para ver un ejemplo de comando, consulte la sección Información adicional.

Los resultados verifican que ambas imágenes tienen el mismo resumen de ID de imagen y resumen de capa.

ID: f7cee5e1af28ad4e147589c474d399b12d9b551ef4c3e11e02d982fce5eebc68

Capas: d5655967c2c4e8d68f8ec7cf753218938669e6c16ac1324303c073c736a2e2a2

Además, los resúmenes se basan en los bytes del objeto que se administra localmente (el archivo local es un tar de la capa de imágenes de contenedor) o en el blob que se inserta en el servidor de registro. Sin embargo, al insertar el blob en un registro, el tar se comprime y el resumen se calcula en el archivo tar comprimido. Por lo tanto, la diferencia en el valor del resumen de extracción de docker se debe a la compresión que se aplica a nivel de registro (Amazon ECR privado o público).

nota

Esta explicación es específica del uso de un cliente Docker. No verá este comportamiento en otros clientes, como nerdctl o Finch, porque no comprimen automáticamente la imagen durante las operaciones de inserción y extracción.

Desarrollador de aplicaciones, DevOps de AWS, administrador de sistemas AWS
TareaDescripciónHabilidades requeridas

Clonar el repositorio.

Clone el repositorio de GitHub para este patrón en una carpeta local:

$git clone https://github.com/aws-samples/automated-solution-to-identify-duplicate-container-images-between-repositories
Administrador de AWS, DevOps de AWS

Configure la canalización de CI/CD.

El repositorio de GitHub incluye un archivo .yaml que crea una pila CloudFormation para configurar una canalización en AWS CodePipeline.

  1. Inicie sesión en la Consola de administración de AWS y abra la consola de CloudFormation.

  2. Cree una pila con el archivo pipeline.yaml de plantilla, que se encuentra en la carpeta code del repositorio clonado.

  3. Acepte o cambie los valores predeterminados de los parámetros. Especifique los valores para los siguientes campos:

    • Nombre de pila

    • ArtifactStoreBucketName: un bucket de S3 existente que se utilizará para almacenar artefactos de AWS CodePipeline

    • OutputBucket: un bucket de S3 existente que se utilizará para almacenar los URI de las imágenes duplicadas

    • SourceImageFile: un archivo de texto existente denominado input.txt que contiene los URI de imagen del repositorio público y que se compararán con el repositorio privado de Amazon ECR para detectar la duplicación

  4. Revise y ajuste las opciones de pila y, a continuación, seleccione Enviar para ejecutar la plantilla.

La canalización se configurará con dos etapas (CodeCommit y CodeBuild, como se muestra en el diagrama de arquitectura) para identificar las imágenes del repositorio privado que también existen en el repositorio público. La canalización está configurada con los siguientes recursos:

  • CodePipeline para la orquestación de la canalización de implementación.

  • Un repositorio de CodeCommit para almacenar el script bash y el archivo de entrada. El script bash se utiliza para comparar los ID de las imágenes de contenedor en los repositorios público y privado para encontrar duplicaciones. Esta comprobación se realiza en todos los repositorios de la Cuenta de AWS especificada en una sola Región de AWS.

  • Un proyecto de CodeBuild para invocar el script bash para identificar las imágenes que ya están presentes en el repositorio de Amazon ECR.

  • Roles de IAM necesarios para permitir el acceso.

  • Un bucket de S3 para almacenar el archivo de salida que contiene los URI de las imágenes.

  • Otro bucket de S3 para almacenar artefactos de CodePipeline. 

Administrador de AWS, DevOps de AWS

Rellene el repositorio de CodeCommit.

Para rellenar el repositorio de CodeCommit, lleve a cabo estos pasos:

  1. Abra la consola de CodeCommit y navegue hasta la Región de AWS en la que creó la pila de CloudFormation.

  2. Busque el repositorio que aprovisionó mediante el script de CloudFormation de la lista, elija Clonar URL y, a continuación, copie el protocolo HTTPS URL para conectarse al repositorio.

  3. Abra un símbolo del sistema y ejecute el comando git clone con la URL HTTPS que ha copiado en el paso anterior.

  4. Vaya al directorio raíz. Cree un archivo denominado input.txt y rellénelo con los URI del registro de imágenes públicas de Amazon ECR que desee buscar en el repositorio privado de Amazon ECR.

  5. Copie los archivos script.sh, buildspec.yml y input.txt desde su copia local del repositorio de GitHub Solución automatizada para identificar imágenes de contenedor duplicadas entre repositorios al repositorio de CodeCommit clonado.

  6. Cargue los archivos en CodeCommit mediante estos comandos:

    git add . git commit -m "added input files" git push
Administrador de AWS, DevOps de AWS

Eliminar recursos.

Para evitar incurrir en cargos en el futuro, elimine los recursos siguiendo estos pasos:

  1. Navegue hasta el bucket de S3 que almacena los artefactos de CodePipeline y vacíe el bucket.

  2. Navegue hasta el bucket de S3 que almacena los URI de las imágenes duplicadas y vacíe el bucket.

  3. Navegue hasta la consola de CloudFormation y elimine la pila que creó para configurar la canalización.

Administrador de AWS

Solución de problemas

ProblemaSolución

Al intentar enviar, extraer o interactuar con un repositorio de CodeCommit desde el terminal o desde la línea de comandos, el sistema le pide que proporcione un nombre de usuario y una contraseña y debe proporcionar las credenciales de Git para el usuario de IAM.

Las siguientes son las causas comunes para esto:

  • Su equipo local ejecuta un sistema operativo que no admite la administración de credenciales o no tiene instalada una utilidad de administración de credenciales.

  • Las credenciales de Git de su usuario de IAM no se han guardado en uno de estos sistemas de administración de credenciales.

Según el sistema operativo y el entorno local, es posible que tenga que instalar un gestor de credenciales, configurar el gestor de credenciales que se incluye en el sistema operativo o personalizar su entorno local para utilizar el almacenamiento de credenciales. Por ejemplo, si su equipo ejecuta macOS, puede usar la utilidad Keychain Access para almacenar sus credenciales. Si su equipo utiliza Windows, puede utilizar el Administrador de credenciales de Git que se instala en Git para Windows. Para obtener más información, consulte Configuración para usuarios de HTTPS que utilizan credenciales de Git en la documentación de CodeCommit y Almacenamiento de credenciales en la documentación de Git.

Al insertar una imagen en el repositorio de Amazon ECR, se producen errores HTTP 403 o “no basic auth credentials”.

Es posible que encuentre estos mensajes de error en los comandos docker push o docker pull, incluso si se ha autenticado correctamente en Docker mediante el comando aws ecr get-login-password. Las causas conocidas son:

  • Se ha autenticado en una región diferente. Para obtener más información, consulte Autenticación de registro privado en la documentación de Amazon ECR.

  • Se ha autenticado para insertar contenido en un repositorio para el que no tiene permisos. Para obtener más información, consulte Políticas de repositorios privados en la documentación de Amazon ECR.

  • Su token ha vencido. El periodo predeterminado de vencimiento de los tokens obtenidos mediante la operación GetAuthorizationToken es de 12 horas.

Recursos relacionados

Información adicional

Resultado de la inspección de Docker para una imagen en el repositorio público de Amazon ECR

[ { "Id": "sha256:f7cee5e1af28ad4e147589c474d399b12d9b551ef4c3e11e02d982fce5eebc68", "RepoTags": [ "<account-id>.dkr.ecr.us-east-1.amazonaws.com/test_ecr_repository:latest", "public.ecr.aws/amazonlinux/amazonlinux:2018.03" ], "RepoDigests": [ "<account-id>.dkr.ecr.us-east-1.amazonaws.com/test_ecr_repository@sha256:52db9000073d93b9bdee6a7246a68c35a741aaade05a8f4febba0bf795cdac02", "public.ecr.aws/amazonlinux/amazonlinux@sha256:f972d24199508c52de7ad37a298bda35d8a1bd7df158149b381c03f6c6e363b5" ], "Parent": "", "Comment": "", "Created": "2023-02-23T06:20:11.575053226Z", "Container": "ec7f2fc7d2b6a382384061247ef603e7d647d65f5cd4fa397a3ccbba9278367c", "ContainerConfig": { "Hostname": "ec7f2fc7d2b6", "Domainname": "", "User": "", "AttachStdin": false, "AttachStdout": false, "AttachStderr": false, "Tty": false, "OpenStdin": false, "StdinOnce": false, "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ], "Cmd": [ "/bin/sh", "-c", "#(nop) ", "CMD [\"/bin/bash\"]" ], "Image": "sha256:c1bced1b5a65681e1e0e52d0a6ad17aaf76606149492ca0bf519a466ecb21e51", "Volumes": null, "WorkingDir": "", "Entrypoint": null, "OnBuild": null, "Labels": {} }, "DockerVersion": "20.10.17", "Author": "", "Config": { "Hostname": "", "Domainname": "", "User": "", "AttachStdin": false, "AttachStdout": false, "AttachStderr": false, "Tty": false, "OpenStdin": false, "StdinOnce": false, "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ], "Cmd": [ "/bin/bash" ], "Image": "sha256:c1bced1b5a65681e1e0e52d0a6ad17aaf76606149492ca0bf519a466ecb21e51", "Volumes": null, "WorkingDir": "", "Entrypoint": null, "OnBuild": null, "Labels": null }, "Architecture": "amd64", "Os": "linux", "Size": 167436755, "VirtualSize": 167436755, "GraphDriver": { "Data": { "MergedDir": "/var/lib/docker/overlay2/c2c2351a82b26cbdf7782507500e5adb5c2b3a2875bdbba79788a4b27cd6a913/merged", "UpperDir": "/var/lib/docker/overlay2/c2c2351a82b26cbdf7782507500e5adb5c2b3a2875bdbba79788a4b27cd6a913/diff", "WorkDir": "/var/lib/docker/overlay2/c2c2351a82b26cbdf7782507500e5adb5c2b3a2875bdbba79788a4b27cd6a913/work" }, "Name": "overlay2" }, "RootFS": { "Type": "layers", "Layers": [ "sha256:d5655967c2c4e8d68f8ec7cf753218938669e6c16ac1324303c073c736a2e2a2" ] }, "Metadata": { "LastTagTime": "2023-03-02T10:28:47.142155987Z" } } ]

Resultado de la inspección de Docker para una imagen en el repositorio privado de Amazon ECR

[ { "Id": "sha256:f7cee5e1af28ad4e147589c474d399b12d9b551ef4c3e11e02d982fce5eebc68", "RepoTags": [ "<account-id>.dkr.ecr.us-east-1.amazonaws.com/test_ecr_repository:latest", "public.ecr.aws/amazonlinux/amazonlinux:2018.03" ], "RepoDigests": [ "<account-id>.dkr.ecr.us-east-1.amazonaws.com/test_ecr_repository@sha256:52db9000073d93b9bdee6a7246a68c35a741aaade05a8f4febba0bf795cdac02", "public.ecr.aws/amazonlinux/amazonlinux@sha256:f972d24199508c52de7ad37a298bda35d8a1bd7df158149b381c03f6c6e363b5" ], "Parent": "", "Comment": "", "Created": "2023-02-23T06:20:11.575053226Z", "Container": "ec7f2fc7d2b6a382384061247ef603e7d647d65f5cd4fa397a3ccbba9278367c", "ContainerConfig": { "Hostname": "ec7f2fc7d2b6", "Domainname": "", "User": "", "AttachStdin": false, "AttachStdout": false, "AttachStderr": false, "Tty": false, "OpenStdin": false, "StdinOnce": false, "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ], "Cmd": [ "/bin/sh", "-c", "#(nop) ", "CMD [\"/bin/bash\"]" ], "Image": "sha256:c1bced1b5a65681e1e0e52d0a6ad17aaf76606149492ca0bf519a466ecb21e51", "Volumes": null, "WorkingDir": "", "Entrypoint": null, "OnBuild": null, "Labels": {} }, "DockerVersion": "20.10.17", "Author": "", "Config": { "Hostname": "", "Domainname": "", "User": "", "AttachStdin": false, "AttachStdout": false, "AttachStderr": false, "Tty": false, "OpenStdin": false, "StdinOnce": false, "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ], "Cmd": [ "/bin/bash" ], "Image": "sha256:c1bced1b5a65681e1e0e52d0a6ad17aaf76606149492ca0bf519a466ecb21e51", "Volumes": null, "WorkingDir": "", "Entrypoint": null, "OnBuild": null, "Labels": null }, "Architecture": "amd64", "Os": "linux", "Size": 167436755, "VirtualSize": 167436755, "GraphDriver": { "Data": { "MergedDir": "/var/lib/docker/overlay2/c2c2351a82b26cbdf7782507500e5adb5c2b3a2875bdbba79788a4b27cd6a913/merged", "UpperDir": "/var/lib/docker/overlay2/c2c2351a82b26cbdf7782507500e5adb5c2b3a2875bdbba79788a4b27cd6a913/diff", "WorkDir": "/var/lib/docker/overlay2/c2c2351a82b26cbdf7782507500e5adb5c2b3a2875bdbba79788a4b27cd6a913/work" }, "Name": "overlay2" }, "RootFS": { "Type": "layers", "Layers": [ "sha256:d5655967c2c4e8d68f8ec7cf753218938669e6c16ac1324303c073c736a2e2a2" ] }, "Metadata": { "LastTagTime": "2023-03-02T10:28:47.142155987Z" } } ]