Não é possível enviar a imagem para o Amazon ECR - falha com "sem credenciais de autenticação básica"

173

Estou tentando enviar uma imagem do docker para um registro do Amazon ECR. Estou usando o cliente docker Docker versão 1.9.1, build a34a1d5. Eu uso aws ecr get-login --region us-east-1para obter os creds de login do docker. Então eu logo com sucesso com esses creds da seguinte maneira:

docker login -u AWS -p XXXX -e none https://####.dkr.ecr.us-east-1.amazonaws.com
WARNING: login credentials saved in /Users/ar/.docker/config.json
Login Succeeded

Mas quando tento enviar minha imagem, recebo o seguinte erro:

$ docker push ####.dkr.ecr.us-east-1.amazonaws.com/image:latest
The push refers to a repository [####.dkr.ecr.us-east-1.amazonaws.com/image] (len: 1)
bcff5e7e3c7c: Preparing 
Post https://####.dkr.ecr.us-east-1.amazonaws.com/v2/image/blobs/uploads/: no basic auth credentials

Verifiquei se o usuário do aws tinha as permissões corretas. Também assegurei-me de que o repositório permitisse que o usuário enviasse para ele. Apenas para garantir que não foi um problema, configurei o registro para permitir acesso total a todos os usuários. Nada muda o "no basic auth credentials"erro. Não sei como começar a depurar isso, pois todo o tráfego é criptografado.

ATUALIZAR

Então, tive um momento do Homer Simpson D'Oh quando percebi a causa raiz do meu problema. Eu tenho acesso a várias contas da AWS. Embora eu estivesse usando aws configurepara definir minhas credenciais para a conta em que havia configurado meu repositório, o aws cli estava realmente usando as variáveis ​​de ambiente AWS_ACCESS_KEY_IDe AWS_SECRET_ACCESS_KEY. Então, quando o fiz aws ecr get-login, estava retornando um login para a conta errada. Não percebi que os números das contas eram diferentes até que voltei agora para tentar algumas das respostas propostas. Quando removo as variáveis ​​de ambiente, tudo funciona corretamente. Eu acho que o lema da história é que, se você acertar esse erro, verifique se o repositório em que você está acessando corresponde à marca que você aplicou à imagem.

Alec Rooney
fonte
10
Você deve tornar a atualização em negrito, sublinhada e em itálico. Eu também tive aquele momento de Homer Simpson. Obrigado!
Mike
Obrigado por reduzi-lo! Você salvou meu dia literalmente!
simonso 29/11
2
O mesmo erro é dado quando o repositório não existe. Verifique se você criou o repositório na região certa.
Ilia Sidorenko
Note que você pode configurar seus AWS cli para lidar com vários perfis de usuário: docs.aws.amazon.com/cli/latest/userguide/...
Peter Berg

Respostas:

111

se você executar, $(aws ecr get-login --region us-east-1)tudo será feito para você

Antonio Terreno
fonte
17
Você é uma lenda. O guia da AWS tinha 5 etapas, todas com um comando shell, exceto a etapa 2, que diz apenas "Execute o comando docker login retornado na etapa anterior". Eu acho que um montão de pessoas como eu se concentrar apenas no comando da shell e não ler as instruções corretamente
Tien Dinh
Time machine - Por que o agrupamento do comando aws em $ () faz com que o logon tenha êxito corretamente?
VtoCorleone
6
@VtoCorleone Porque o comando aws apenas imprime um comando do docker na saída padrão. Se você quebrar essa string em $ (), ela será interpretada pelo shell e o docker logincomando será executado.
Otávio Macedo
2
$ (aws ecr get-login - região us-west-2) sinalizador abreviado desconhecido: 'e' em -e Consulte 'login do docker --help'.
Ashish Karpe
23
se você estiver recebendo "sinal abreviado desconhecido: 'e'", execute o comando com o sinalizador --no-include-email como este: $ (aws ecr get-login - região us-east-1 - no-include-email)
Trenton
57

No meu caso, houve um erro no Docker for Windows e no suporte ao Windows Credential Manager.

Abra o seu ~/.docker/config.jsone remova a "credsStore": "wincred"entrada.

Isso fará com que as credenciais sejam gravadas config.jsondiretamente. Você precisará fazer login novamente depois.

Você pode rastrear esse bug nos tickets # 22910 e # 24968 no GitHub.

Der Hochstapler
fonte
Obrigado - trabalhou no Windows 10. Depois de remover essa propriedade da configuração e executar o comando docker login novamente, o arquivo de configuração foi atualizado com credenciais e o envio foi efetuado.
Cameron #
Não consigo encontrar o arquivo de configuração. Você pode me sugerir a localização do arquivo config.json?
Ramashanker Tripathi
@RamashankerTripathi A localização está na resposta. Não tenho certeza de como poderia ser mais claro.
Der Hochstapler #
@OliverSalzburg Obrigado pela resposta. Na verdade, meu diretório de instalação do Docker não contém o arquivo config.json.
Ramashanker Tripathi
@RamashankerTripathi ~/.dockersignifica .dockerno seu diretório pessoal. Tente%HOMEDRIVE%%HOMEPATH%\.docker
Der Hochstapler
50

Se você usa perfis, não esqueça de passar --profile=XXXpara aws ecr get-login.

Greg
fonte
27

Eu tive esse problema também. O que aconteceu comigo foi que eu esqueci de executar o comando que me foi devolvido após a execução

aws ecr get-login --region ap-southeast-2

Este comando retornou um grande blob, que inclui o docker logincomando ali mesmo! Eu não percebi. Deve retornar algo como isto:

docker login -u AWS -p <your_token_which_is_massive> -e none <your_aws_url>

Copie e cole este comando e, em seguida, execute o comando docker push que se parece com isso:

docker push 8888888.blah.blah.ap-southwest-1.amazonaws.com/dockerfilename
James111
fonte
1
Eu não tinha ideia de qual era a resposta do blob, então eu a ignorei. haha Obrigado por apontar isso!
duyn9uyen
14

Isso deveria ter funcionado mesmo sem abrir as permissões. Consulte a documentação: Autenticação de registro particular .

[Editar: na verdade, eu também tive problemas com permissões ao fazer um segundo teste. Consulte Envio do Docker ao repositório particular da AWS ECR falhando com JSON malformado .]

No entanto, eu tive o mesmo problema; Não sei por que, mas usei com êxito o mecanismo de autenticação mais extenso descrito nos documentos para o token de autorização de obtenção

Versões da AWS CLI e Docker:

$ aws --version
aws-cli/1.9.17 Python/2.7.6 Linux/3.16.0-38-generic botocore/1.3.17
$ docker --version
Docker version 1.9.1, build a34a1d5

Obtenha o token de autenticação ('senha do docker').

aws ecr get-authorization-token --region us-east-1 --output text \
    --query authorizationData[].authorizationToken | base64 -d | cut -d: -f2

Nota: Meu ~ / .aws / config especifica uma região padrão diferente, então eu precisei definir explicitamente --region us-east-1.

Faça logon interativamente (mude ############para o ID da sua conta da AWS):

docker login -u AWS https://############.dkr.ecr.us-east-1.amazonaws.com/
password: <paste the very long password from above>
email: <I left this blank>

Envie uma imagem (assumindo que você criou uma imagem do Docker test):

docker tag test:latest ############.dkr.ecr.us-east-1.amazonaws.com/test:latest
docker push ############.dkr.ecr.us-east-1.amazonaws.com/test:latest
The push refers to a repository [910732017890.dkr.ecr.us-east-1.amazonaws.com/test] (len: 1)
d5122f58a2e1: Pushed 
7bddbca3b908: Pushed 
latest: digest: sha256:bc0b521fd398bd1a2ef58a289dcb910334608723fd570e7bddb36eacd0060363 size: 4378
inquieto
fonte
Como você colou a senha muito longa ??? O meu é várias linhas. Estou usando o Windows Docker Quickstart Terminal, que parece não ter boa capacidade de copiar / colar, ou talvez simplesmente não consiga descobrir.
David David
Para quem quiser saber, eu apenas tive que marcar e copiar a coisa toda, incluindo espaços em branco, e depois colar no Bloco de Notas. A partir daí, removo as quebras de linha e copio tudo, e só então posso colar na linha de comando do terminal. Isso funcionou.
David David
Se você estiver usando o PowerShell, vá para a guia Propriedades> Opções e selecione "Ativar seleção de quebra de linha". Dessa forma, você pode clicar e arrastar para selecionar as linhas repartidas sem ter que copiando manualmente no bloco de notas, excluir novas linhas etc.
adarshr
Eu não toquei uma máquina Windows em quase 10 anos, mas você pode sempre stdout pipe para um arquivo: aws ecr get-authorization-token > config.jsone abra-o no seu editor de texto favorito para copiar e colar à vontade
pcting
13

Tente com:

eval $(aws ecr get-login --no-include-email | sed 's|https://||')

antes de empurrar.

MrMins
fonte
Eu entendino basic auth credentials Invalid IPv6 URL
Thanh Nguyen Van
12

Atualizar

Desde que o AWS CLI versão 2 - aws ecr get-loginfoi preterido e o método correto é aws ecr get-login-password.

Portanto, a resposta correta e atualizada é a seguinte: docker login -u AWS -p $(aws ecr get-login-password --region us-east-1) xxxxxxxx.dkr.ecr.us-east-1.amazonaws.com

Omry Zobel
fonte
I getunknown flag: --region
kittu
11

Se isso ajuda alguém ...

Meu problema era que eu tinha que usar a --profileopção para autenticar com o perfil adequado do arquivo de credenciais.

Em seguida, omiti o --region [region_name]comando, que também deu o erro "sem credenciais de autenticação básica".

A solução para mim foi mudar meu comando a partir disso:

aws ecr get-login

Para isso:

aws --profile [profile_name] ecr get-login --region [region_name]

Exemplo:

aws --profile foo ecr get-login --region us-east-1

Espero que ajude alguém!

Lansana Camara
fonte
1
Você me salvou! Eu estava usando meu perfil do aws assim, AWS_PROFILE=myprofile aws ecr get-logine não funcionou, mas a introdução do perfil do aws com --profileargumento é o truque!
Colo Ghidini
8

Há um bug conhecido no gerenciador de credenciais do wincred no Windows. A remoção de 'https: //' do comando de login gerado resolve isso.

docker login -u AWS -p <password> <aws_account_id>.dkr.ecr.<region>.amazonaws.com

ao invés de

docker login -u AWS -p <password> https://<aws_account_id>.dkr.ecr.<region>.amazonaws.com

Consulte também a página de solução de problemas .

Tom Rijntjes
fonte
8

Eu experimentei o mesmo problema.

A geração de novas credenciais da AWS (chaves de acesso) e a reconfiguração da AWS CLI com novas credenciais resolveram o problema.

aws ecr get-login --region us-east-1Comando de login do docker gerado anteriormente com URL de registro EC inválido.

temasso
fonte
O mesmo aconteceu comigo. Obrigado!
Greendrake
Este foi o meu problema. Eu tinha credenciais de CLI da AWS diferentes armazenadas nas ~ / .aws / credenciais do que os aws que eu estava gerenciando. Recriou novas credenciais e configurações que funcionaram.
Martin Algesten 6/11
6

No Windows no PowerShell , use:

Invoke-Expression $(aws ecr get-login --no-include-email)
Igor Akkerman
fonte
este ainda é relevante
Chappie Johnson
5

Eu tive esse problema por uma causa diferente: precisava enviar para um registro não associado à minha conta da AWS (registro de ECR de um cliente). O cliente me concedeu acesso na guia Permissões do registro, adicionando meu ID do IAM (por exemplo, arn:aws:iam::{AWS ACCT #}:user/{Username}) como Principal. Tentei fazer o login com as etapas usuais:

$(aws ecr get-login --region us-west-2 --profile profilename)
docker push {Client AWS ACCT #}.dkr.ecr.us-west-1.amazonaws.com/imagename:latest

O que, obviamente, resultou no basic auth credentials. Como se vê , aws ecr get-loginefetua login no ECR para o registro associado ao seu logon , o que faz sentido em retrospecto. A solução é informar em aws ecr get-loginquais registros você deseja fazer login.

$(aws ecr get-login --region us-west-2 --profile profilename --registry-ids {Client AWS ACCT #})

Depois disso, docker pushfunciona muito bem.

Jason Clark
fonte
isso faz sentido. Mas o que você deve passar no --profile? Eu tenho uma conta pessoal, mas estou tentando enviar para uma conta corporativa. Em outras palavras, onde encontroprofilename
Ciprian Tomoiagă
1
@ CiprianTomoiagă você deve incluir apenas isso se estiver usando perfis nomeados. Veja aqui docs.aws.amazon.com/cli/latest/userguide/…
Sergio
5
  1. Verifique se você criou o registro ECR primeiro.
    Em seguida, de acordo com as Instruções de comando push do ECR, recorte e cole os seguintes comandos
  2. Execute o comando docker login (eval no Mac / Linux ignora o recortar e colar) e
    eval $(aws ecr get-login --region us-east-1)
    adicione --profile se você usar várias contas da AWS
    eval $(aws ecr get-login --region us-east-1 --profile your-profile)
  3. docker build -t image-name .
  4. docker tag image-name:latest ############.dkr.ecr.us-east-1.amazonaws.com/image-name:latest
  5. docker push ############.dkr.ecr.us-east-1.amazonaws.com/image-name:latest

Em caso de erro, certifique-se de executar todos os comandos novamente! As credenciais que você usa aws ecr get-loginsão temporárias e expiram.

Jason
fonte
onde descubro o que colocar your-profile?
Andy
Você pode deixar de fora se estiver usando o perfil padrão
Jason
Eu estava tentando descobrir como não usar o perfil padrão. Eu percebi isso, perfis extras podem ser inseridos nos arquivos ~/.aws/confige ~/.aws/credentials.
Andy
5

No meu caso, após a execução aws ecr get-login --no-include-email --region *****, eu apenas copiei a saída desse comando com é do formulário docker login -u *** -p ************e você a cola no prompt. O empurrão foi em frente.

Julien Nyambal
fonte
4

Os documentos da AWS dizem para você executar o seguinte comando (para a região ap-sudeste-2)

aws ecr get-login --region ap-southeast-2

Quando deparei com esse problema, não estava claro para mim, com base nesses documentos, que você precisava inserir o resultado desse comando no terminal e executá-lo.

A correção que funcionou para mim foi copiar o resultado na área de transferência com

aws ecr get-login --region ap-southeast-2 | pbcopy

Cole o resultado na linha de comando e execute-o

Dan Groch
fonte
4

Depois de executar este comando:

(aws ecr get-login --no-include-email --region us-west-2)

basta executar o comando docker login a partir da saída

docker login -u AWS -p epJ....

é a maneira como o docker efetua login no ECR

Javier Rodriguez
fonte
3

Esse erro geralmente é gerado se o login ecr falhou. Estou usando o sistema Windows e usei o "Powershell" no modo Administrador para fazer login na tela primeiro.

Invoke-Expression $(aws ecr get-login --no-include-email)

Isso deve gerar "Login bem-sucedido".

kumarras
fonte
obrigado! por que isso ajudou? eu já estava fazendo login usando saml2aws.
influente
2

Eu enfrentei o mesmo problema e o erro que cometi foi usar o caminho de repo incorreto

por exemplo: docker push xxxxxxxxxxxxxx.dkr.ecr.us-east-1.amazonaws.com/jenkins:latest

No caminho acima, foi aqui que cometi o erro: Em "dkr.ecr.us-east-1.amazonaws.com"vez de "west". Eu estava usando " east". Depois que corrigi meu erro, fui capaz de enviar a imagem com êxito.

karthik vee
fonte
2

O comando docker dado pelo aws-cli está pouco ...

Ao usar o login do docker, o docker salvará um par de chaves server: no seu keychain ou no arquivo ~ / .docker / config.json

Se ele salva a chave sob https://7272727.dkr.ecr.us-east-1.amazonaws.coma pesquisa para a chave durante o impulso irá falhar porque janela de encaixe vai estar à procura de um servidor chamado 7272727.dkr.ecr.us-east-1.amazonaws.comnãohttps://7272727.dkr.ecr.us-east-1.amazonaws.com .

Use o seguinte comando para efetuar login:

eval $(aws ecr get-login --no-include-email --region us-east-1 --profile yourprofile | sed 's|https://||')

Depois de executar o comando, você receberá uma 'Login Succeeded'mensagem e estará bom
depois que o comando push deve funcionar

Dakshin Rajavel
fonte
2

Há uma maneira muito simples de enviar imagens do docker para o ECR: Amazon ECR Docker Credential Helper . Basta instalá-lo de acordo com o guia fornecido, atualizar o seu ~/.docker/config.jsonda seguinte forma:

{
    "credsStore": "ecr-login"
}

e você poderá empurrar / puxar suas imagens sem docker login.

Cepr0
fonte
Eu recebi o mesmo erro depois de seguir as instruções deste artigo.
ryechus 13/01
1

Eu corri para esse problema também em execução no OSX. Eu vi a resposta de Oliver Salzburg e verifiquei meu ~ / .docker / config.json. Ele tinha várias credenciais de autorização dentro das diferentes contas da AWS que eu tenho. Eu apaguei o arquivo e depois de executar o get-login novamente, ele funcionou.

Minh Tran
fonte
1

Certifique-se de usar a região correta aws ecr get-login, ela deve corresponder à região em que seu repositório é criado.

Lech Migdal
fonte
1

Meu problema foi ter várias credenciais da AWS; padrão e dev. Desde que eu estava tentando implantar para dev isso funcionou:

$(aws ecr get-login --no-include-email --region eu-west-1 --profile dev | sed 's|https://||')
hfogel
fonte
1

FWIW, Debian 9, Docker versão 18.06.1-ce, compilação e68fc7a:

$(aws ecr get-login | sed 's| -e none | |g')

Ligemer
fonte
1

Se você usar vários perfis e precisar fazer login em um perfil que não seja o padrão, faça o login com este comando:

$(AWS_PROFILE=<YOUR PROFILE> aws ecr get-login --no-include-email --region eu-west-1)
Zlandorf
fonte
1

O comando a seguir funciona para mim:

sudo $(aws ecr get-login --region us-east-1 --no-include-email)

E então eu executo estes comandos:

sudo docker tag e9ae3c220b23(image_id) aws_account_id.dkr.ecr.region.amazonaws.com/my-web-app

sudo docker push aws_account_id.dkr.ecr.region.amazonaws.com/my-web-app
Chirag Kalal
fonte
0

Também encontramos esse problema hoje e tentamos tudo mencionado nesta postagem (exceto a geração de credenciais da AWS).

Finalmente, resolvemos o problema simplesmente atualizando o Docker e o envio funcionou.

O problema foi encontrado com o Docker 1.10.x e foi resolvido com o Docker 1.11.x.

Espero que isto ajude

Baptiste Gaillard
fonte
0

Se você estiver isolando as contas da AWS para fins de IC / CD e tiver um repositório de ECR compartilhado entre várias contas da AWS, poderá ser necessário alterar o ~/.docker/config.json manualmente.

Digamos que você tenha estas configurações:

  1. O ECR pertence à ID da conta da AWS 00000000000000
  2. O servidor de IC pertence ao ID da conta da AWS 99999999999999

Se você ligar aws ecr get-login --region us-west-2 | bashno servidor de IC, o docker gerará credenciais temporárias ~/.docker/config.json.

{
  "auths": {
    "https://99999999999999.dkr.ecr.us-west-2.amazonaws.com": {
      "auth": "long-token.."
    }
  }
}

Mas você deseja apontar para a conta do ECR, portanto, você precisa alterar o nome do host.

{
  "auths": {
    "https://00000000000000.dkr.ecr.us-west-2.amazonaws.com": {
      "auth": "long-token.."
    }
  }
}

Observe que essa situação depende de como você forma a política / usuário do IAM para permitir o acesso ao ECR.

tomodiano
fonte
0
aws ecr get-login --region us-west-1 --no-include-email

Este comando me dá o comando correto para efetuar login. Se você não usar "--no-include-email", isso gerará outro erro. A saída do comando acima se parece com esse login na janela de encaixe -u AWS -p ********************** muito grande ******. Copie isso e execute-o. Agora ele mostrará "Login com êxito". Agora você pode enviar sua imagem para ECR.

Verifique se a regra da AMI tem permissão para o usuário que você tentou fazer login.

Omar Faroque Anik
fonte