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