¿Cómo puedo recuperar una imagen de Docker de un repositorio privado y usarla en una plataforma de Docker de Elastic Beanstalk?

4 minutos de lectura
0

Quiero extraer una imagen de Docker de un repositorio privado y usarla en mi plataforma de Elastic Beanstalk.

Descripción breve

Al extraer una imagen de un repositorio privado, es posible que aparezca el siguiente error en la instancia de Elastic Beanstalk:

Mensaje de error de /var/log/ecs/ecs-agent.log[CannotPullContainerError] Respuesta de error del daemon: acceso a extracción denegado para {username}/{repo}, el repositorio no existe o puede requerir "docker login": denegado: se deniega el acceso solicitado al recurso» module=docker_client.go

Este error se produce cuando hay una brecha de autenticación entre el registro privado y Elastic Beanstalk. Para usar una imagen de un repositorio privado, Elastic Beanstalk debe autenticarse con el registro en línea que aloja el repositorio privado. Debe autenticarse antes de recuperar y desplegar las imágenes de un repositorio privado. Hay dos opciones para recuperar y almacenar las credenciales de un entorno de Elastic Beanstalk a fin de autenticarse en un repositorio privado:

  • Almacén de parámetros de AWS Systems Manager (SSM)
  • Archivo Dockerrun.aws.json

Resolución

Para recuperar una imagen de Docker de un repositorio privado mediante un archivo Dockerrun.aws.json, siga estos pasos:

  1. Generar un token de autenticación válido
  2. Crear un bucket de Amazon Simple Storage Service (Amazon S3) y almacenar el archivo de autenticación
  3. Crear el archivo Dockerrun.aws.json v2

Generar un token de autenticación válido

Nota: Si recibe errores al ejecutar los comandos de la Interfaz de la línea de comandos de AWS (AWS CLI), confirme que está ejecutando una versión reciente de la AWS CLI.

  1. Instale Docker en su máquina ejecutando el siguiente comando:

    $ brew install docker
  2. Cree una cuenta en dockerhub.

  3. Cree un repositorio y transfiera una imagen a este.

  4. Ejecute el comando Docker login:

    $ Docker login
  5. Cree un archivo denominado credentials.env mediante el siguiente comando:

    $ vi credentials.env
  6. Añada las siguientes credenciales al archivo anterior creado:

    Nota: Asegúrese de reemplazar todas las cadenas de ejemplo con los valores especificados y, a continuación, guarde el archivo y salga del modo editor.

    DOCKER_USERNAME=example-user-name
    DOCKER_PASSWORD=example-password
    DOCKER_REGISTRY=https://index.docker.io/v1/
  7. Ejecute el comando siguiente:

    docker run -it --rm \
    -env-file=credentials.env \
    v "$(pwd):/opt/data/" \
    v "/var/run/docker.sock:/var/run/docker.sock" \
    codeship/dockercfg-generator /opt/data/dockercfg
  8. Recupere el archivo .dockercfg:

    $ cat  /opt/data/dockercfg

    Ejemplo de salida:

    {
    "https://index.docker.io/v1/ ": {
    "auth": '**************************AMTE="     
    },
    "HttpHeaders": {
    "User-Agent": "Docker-Client/18.03.1-ce (linux)"
    }
    }

    Nota: Asegúrese de incluir el archivo .dockercfg en el paquete de origen de su aplicación.

Crear un bucket de Amazon S3 y almacenar el archivo de autenticación

Cree un bucket seguro de Amazon S3 y transfiera el archivo .dockercfg al bucket. Asegúrese de lo siguiente:

  • El bucket de Amazon S3 está alojado en la misma región de AWS que el entorno que lo usa. Elastic Beanstalk no puede descargar archivos de un bucket de Amazon S3 alojado en otras regiones.
  • Se conceden permisos para la operación s****3:GetObject al rol de AWS Identity and Access Management (IAM) en el perfil de instancia.

Crear el archivo Dockerrun.aws.json v2

Cree el archivo Dockerrun.aws.json v2 ejecutando el siguiente comando y añada la información del bucket de Amazon S3 en el parámetro authentication:

  • Para el parámetro bucket, añada la información de su bucket de Amazon S3.
  • Para el parámetro image, añada el nombre de su imagen con la etiqueta. Puede recuperarlo de su cuenta de dockerhub.
{
"AWSEBDockerrunVersion": 2,  
"authentication": {    
"bucket": "example-bucket-name",    
"key": ".dockercfg"  
},  
"volumes": [    
{      
"name": "php-app",      
"host": {        
"sourcePath": "/var/app/current/php-app"      
}    
},    
{      
"name": "nginx-proxy-conf",      
"host": {        
"sourcePath": "/var/app/current/proxy/conf.d"      
}    
}  
],  
"containerDefinitions": [    
{      
"name": "php-app",      
"image": "example-image-name",      
"essential": true,      
"memory": 128,      
"mountPoints": [        
{          
"sourceVolume": "php-app",          
"containerPath": "/var/www/html",          
"readOnly": true        
},        
{          
"sourceVolume": "awseb-logs-php-app",          
"containerPath": "/var/log/sample-app"        
}      
]    
},    
{      
"name": "nginx-proxy",      
"image": "nginx",      
"essential": true,      
"memory": 128,      
"portMappings": [        
{          
"hostPort": 80,          
"containerPort": 80        
}      
],      
"links": [        
"php-app"      
],      
"mountPoints": [        
{          
"sourceVolume":"php-app",          
"containerPath": "/var/www/html",          
"readOnly": true        
},        
{          
"sourceVolume": "awseb-logs-nginx-proxy",          
"containerPath": "/var/log/nginx"        
},        
{          
"sourceVolume": "nginx-proxy-conf",          
"containerPath": "/etc/nginx/conf.d",          
"readOnly": true        
}      
]    
}  
]
}

Nota: El comando anterior permite que su instancia de Elastic Beanstalk se autentique correctamente con el registro en línea.

Información relacionada

Usar imágenes de un repositorio privado

Acceder a imágenes privadas de Docker desde AWS Elastic Beanstalk

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace un año