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.


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ê


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.


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.


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

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

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.


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


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!


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 .


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.


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


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.


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.


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.


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


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


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".


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.


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


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.


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.


1

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


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://||')

1

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

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


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)

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

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


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.



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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.