Como faço para recuperar uma imagem do Docker de um repositório privado e usá-la em uma plataforma Docker do Elastic Beanstalk?
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:
- Gerar um token de autenticação válido
- Criar um bucket do Amazon Simple Storage Service (Amazon S3) e armazene o arquivo de autenticação
- 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.
-
Instale o Docker na sua máquina executando o seguinte comando:
$ brew install docker
-
Crie uma conta no dockerhub.
-
Crie um repositório e transfira uma imagem para ele.
-
Execute o comando de login do Docker:
$ Docker login
-
Crie um arquivo chamado credentials.env usando o seguinte comando:
$ vi credentials.env
-
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/
-
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
-
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
Conteúdo relevante
- AWS OFICIALAtualizada há 3 anos
- AWS OFICIALAtualizada há 2 anos
- AWS OFICIALAtualizada há 4 anos