Como faço para recuperar uma imagem do Docker de um repositório privado e usá-la em uma plataforma Docker do Elastic Beanstalk?

4 minuto de leitura
0

Quero extrair uma imagem do Docker de um repositório privado e usá-la na minha plataforma do Elastic Beanstalk.

Descrição breve

Ao extrair uma imagem de um repositório privado, você pode receber o seguinte erro da sua instância do Elastic Beanstalk:

Mensagem de erro de /var/log/ecs/ecs-agent.log[CannotPullContainerError] Resposta de erro do daemon: acesso de extração negado para {username}/{repo}, o repositório não existe ou pode exigir 'login 'docker login': negado: o acesso solicitado ao recurso foi negado" module=docker_client.go

Esse erro ocorre quando há uma lacuna de autenticação entre o registro privado e o Elastic Beanstalk. Para usar uma imagem de um repositório privado, o Elastic Beanstalk deve se autenticar no registro online que hospeda o repositório privado. Ele deve ser autenticado antes de recuperar e implantar suas imagens de um repositório privado. Há duas opções para recuperar e armazenar credenciais para que um ambiente do Elastic Beanstalk se autentique em um repositório privado:

  • Armazenamento de parâmetros do AWS Systems Manager (SSM)
  • Arquivo Dockerrun.aws.json

Resolução

Para recuperar uma imagem do Docker de um repositório privado usando um arquivo Dockerrun.aws.json, conclua as seguintes etapas:

  1. Gerar um token de autenticação válido
  2. Criar um bucket do Amazon Simple Storage Service (Amazon S3) e armazene o arquivo de autenticação
  3. Criar o arquivo Dockerrun.aws.json v2

Gerar um token de autenticação válido

Observação: se você receber erros ao executar comandos da AWS Command Line Interface (AWS CLI), confirme se está executando uma versão recente da AWS CLI.

  1. Instale o Docker na sua máquina executando o seguinte comando:

    $ brew install docker
  2. Crie uma conta no dockerhub.

  3. Crie um repositório e transfira uma imagem para ele.

  4. Execute o comando de login do Docker:

    $ Docker login
  5. Crie um arquivo chamado credentials.env usando o seguinte comando:

    $ vi credentials.env
  6. Adicione as seguintes credenciais ao arquivo criado anteriormente:

    Observação: certifique-se de substituir todas as strings de exemplo pelos valores especificados, salve o arquivo e saia do modo de editor.

    DOCKER_USERNAME=example-user-name
    DOCKER_PASSWORD=example-password
    DOCKER_REGISTRY=https://index.docker.io/v1/
  7. Execute o seguinte comando:

    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 o arquivo .dockercfg:

    $ cat  /opt/data/dockercfg

    Saída de exemplo:

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

    Observação: certifique-se de incluir o arquivo .dockercfg no pacote de origem da aplicação.

Criar um bucket do Amazon S3 e armazenar o arquivo de autenticação

Crie um bucket seguro do Amazon S3 e transfira o arquivo .dockercfg para o bucket. Certifique-se do seguinte:

  • O bucket do Amazon S3 está hospedado na mesma região da AWS do ambiente que o está usando. O Elastic Beanstalk não pode baixar arquivos de um bucket do Amazon S3 hospedado em outras regiões.
  • Permissões foram concedidas para a operação s****3:GetObject ao perfil do AWS Identity and Access Management (IAM) no perfil da instância.

Criar o arquivo Dockerrun.aws.json v2

Crie o arquivo Dockerrun.aws.json v2 executando o comando a seguir e adicione as informações do bucket do Amazon S3 sob o parâmetro de autenticação:

  • Para o parâmetro de bucket, adicione suas informações de bucket do Amazon S3.
  • Para o parâmetro de imagem, adicione o nome da imagem com a tag. Ele pode ser recuperado da sua conta no 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        
}      
]    
}  
]
}

Observação: o comando anterior permite que sua instância do Elastic Beanstalk se autentique com sucesso no registro online.

Informações relacionadas

Usar imagens de um repositório privado

Acessar imagens privadas do Docker a partir do AWS Elastic Beanstalk

AWS OFICIAL
AWS OFICIALAtualizada há 10 meses