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.