No se puede enviar la imagen a Amazon ECR; falla con "sin credenciales de autenticación básicas"

174

Estoy tratando de insertar una imagen acoplable en un registro de Amazon ECR. Estoy usando Docker Client Docker versión 1.9.1, compilación a34a1d5. Utilizo aws ecr get-login --region us-east-1para obtener los créditos de inicio de sesión de Docker. Luego inicié sesión con éxito con esos créditos de la siguiente manera:

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

Pero cuando trato de empujar mi imagen me sale el siguiente error:

$ 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

Me aseguré de que el usuario aws tuviera los permisos correctos. También me aseguré de que el repositorio permitiera a ese usuario presionarlo. Solo para asegurarme de que no era un problema, configuré el registro para permitir que todos los usuarios tengan acceso completo. Nada cambia el "no basic auth credentials"error. No sé cómo comenzar a depurar esto ya que todo el tráfico está encriptado.

ACTUALIZAR

Así que tuve un momento de Homer Simpson D'Oh cuando me di cuenta de la causa raíz de mi problema. Tengo acceso a varias cuentas de AWS. A pesar de que estaba usando aws configuremis credenciales para la cuenta donde había configurado mi repositorio, aws cli estaba usando las variables de entorno AWS_ACCESS_KEY_IDy AWS_SECRET_ACCESS_KEY. Entonces, cuando lo hice aws ecr get-login, estaba devolviendo un inicio de sesión para la cuenta incorrecta. No noté que los números de cuenta eran diferentes hasta que volví ahora para probar algunas de las respuestas propuestas. Cuando elimino las variables de entorno, todo funciona correctamente. Supongo que el lema de la historia es que si encuentras este error, asegúrate de que el repositorio en el que estás iniciando sesión coincida con la etiqueta que has aplicado a la imagen.

Alec Rooney
fuente
10
Debe hacer esa actualización en negrita, subrayado y en cursiva. También acabo de tener ese momento de Homer Simpson. ¡Gracias!
Mike
¡Gracias por reducirlo! ¡Me salvaste el día literalmente!
simonso
2
Se da el mismo error cuando el repositorio no existe. Compruebe si creó el repositorio en la región correcta.
Ilia Sidorenko
Tenga en cuenta que puede configurar su aws cli para manejar múltiples perfiles de usuario: docs.aws.amazon.com/cli/latest/userguide/…
Peter Berg

Respuestas:

111

si corres, $(aws ecr get-login --region us-east-1)todo estará hecho por ti

Antonio Terreno
fuente
17
Eres una leyenda La guía de AWS tenía 5 pasos, todos con un comando de shell, excepto el paso 2, que solo dice "Ejecute el comando de inicio de sesión Docker que se devolvió en el paso anterior". Supongo que un montón de personas como yo solo se centraron en el comando de shell y no leyeron las instrucciones correctamente
Tien Dinh
Máquina del tiempo: ¿por qué envolver el comando aws en $ () hace que el inicio de sesión se realice correctamente?
VtoCorleone
66
@VtoCorleone Debido a que el comando aws simplemente imprime un comando acoplable en la salida estándar. Si ajusta esa cadena en $ (), será interpretada por el shell y docker loginse ejecutará el comando.
Otavio Macedo
2
$ (aws ecr get-login - región us-west-2) bandera abreviada desconocida: 'e' en -e Ver 'docker login --help'.
Ashish Karpe
23
si obtiene "indicador de taquigrafía desconocido: 'e'", debe ejecutar el comando con el indicador --no-include-email como este: $ (aws ecr get-login --region us-east-1 - no-include-email)
Trenton
57

En mi caso, esto fue un error con Docker para Windows y su soporte para el Administrador de credenciales de Windows.

Abra su ~/.docker/config.jsony elimine la "credsStore": "wincred"entrada.

Esto hará que las credenciales se escriban config.jsondirectamente en el. Tendrás que iniciar sesión nuevamente después.

Puede rastrear este error a través de los tickets # 22910 y # 24968 en GitHub.

Der Hochstapler
fuente
Gracias: funcionó en Windows 10. Después de eliminar esa propiedad de la configuración y ejecutar nuevamente el comando de inicio de sesión de Docker, el archivo de configuración se actualizó con credenciales, y push funcionó.
Cameron
No puedo encontrar el archivo de configuración. ¿Me puede sugerir la ubicación del archivo config.json?
Ramashanker Tripathi
@RamashankerTripathi La ubicación está en la respuesta. No estoy seguro de cómo podría ser más claro.
Der Hochstapler
@OliverSalzburg Gracias por responder. En realidad, mi directorio de instalación de Docker no contiene el archivo config.json.
Ramashanker Tripathi
@RamashankerTripathi ~/.dockersignifica .dockeren su directorio de inicio. Prueba%HOMEDRIVE%%HOMEPATH%\.docker
Der Hochstapler
50

Si usa perfiles, no olvide pasar --profile=XXXa aws ecr get-login.

Greg
fuente
27

También tuve este problema. Lo que sucedió conmigo fue que olvidé ejecutar el comando que me devolvieron después de ejecutar

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

Este comando devolvió un gran blob, que incluye el docker logincomando allí mismo. No me di cuenta Debería devolver algo como esto:

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

Copie y pegue este comando y luego ejecute el comando push docker que se parece a esto:

docker push 8888888.blah.blah.ap-southwest-1.amazonaws.com/dockerfilename
James111
fuente
1
No tenía idea de cuál era la respuesta de esa gota, así que lo ignoré. jaja. ¡Gracias por señalar esto!
duyn9uyen
15

Esto debería haber funcionado incluso sin abrir los permisos. Consulte la documentación: Autenticación de registro privado .

[Editar: en realidad, tuve problemas de permisos también al hacer una segunda prueba. Consulte Docker push to AWS ECR repo privado que falla con JSON mal formado ).]

Sin embargo, tuve el mismo problema; No sé por qué, pero utilicé con éxito el mecanismo de autenticación más extenso descrito en los documentos para obtener el token de autorización

AWS CLI y versiones de 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

Obtenga el token de autenticación ('contraseña del acoplador').

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

Nota: Mi ~ / .aws / config especifica una región predeterminada diferente, por lo que necesitaba establecerla explícitamente --region us-east-1.

Inicie sesión de forma interactiva (cambie ############a su ID de cuenta de 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>

Empuje una imagen (suponiendo que haya creado una imagen acoplable 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
fabuloso
fuente
¿Cómo pegaste la contraseña muy larga? El mío es de varias líneas. Estoy usando el Terminal de inicio rápido de Windows Docker, que no parece tener una buena capacidad de copiar / pegar, o tal vez simplemente no puedo entenderlo.
David
Para cualquier otra persona que se pregunte, solo tuve que marcar y copiar todo, incluido el espacio en blanco, y luego pegarlo en el Bloc de notas. A partir de ahí, elimino los saltos de línea y vuelvo a copiar todo, y solo entonces puedo pegar en la línea de comando del terminal. Eso funciono.
David
Si está utilizando PowerShell, vaya a Propiedades> pestaña Opciones y seleccione "Activar selección de ajuste de línea". De esa manera, puede hacer clic y arrastrar para seleccionar las líneas
ajustadas
No he tocado una máquina con Windows en casi 10 años, pero siempre puedes canalizar stdout a un archivo: aws ecr get-authorization-token > config.jsony luego abrirlo en tu editor de texto favorito para copiar y pegar a voluntad
partir del
13

Probar con:

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

Antes de empujar.

MrMins
fuente
Tengo estono basic auth credentials Invalid IPv6 URL
Thanh Nguyen Van
13

Actualizar

Desde AWS CLI versión 2 - aws ecr get-loginestá en desuso y el método correcto es aws ecr get-login-password.

Por lo tanto, la respuesta correcta y actualizada es la siguiente: docker login -u AWS -p $(aws ecr get-login-password --region us-east-1) xxxxxxxx.dkr.ecr.us-east-1.amazonaws.com

Omry Zobel
fuente
Me saleunknown flag: --region
kittu
11

Si ayuda a alguien ...

Mi problema fue que tuve que usar la --profileopción para autenticarme con el perfil adecuado del archivo de credenciales.

Luego, había omitido el --region [region_name]comando, que también daba el error "sin credenciales de autenticación básicas".

La solución para mí fue cambiar mi comando de esto:

aws ecr get-login

A esto:

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

Ejemplo:

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

Espero que ayude a alguien!

Lansana Camara
fuente
1
¡Me salvaste! Estaba usando mi perfil de aws de esta manera, AWS_PROFILE=myprofile aws ecr get-loginy no funcionó, ¡pero presentar el perfil de aws con --profileargumento hace el truco!
Colo Ghidini
8

Hay un error conocido en el administrador de credenciales wincred en Windows. Eliminar 'https: //' del comando de inicio de sesión generado resuelve esto.

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

en vez de

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

Vea también la página de solución de problemas .

Tom Rijntjes
fuente
8

Experimenté el mismo problema.

La generación de nuevas credenciales de AWS (claves de acceso) y la reconfiguración de AWS CLI con nuevas credenciales resolvieron el problema.

Anteriormente, aws ecr get-login --region us-east-1comando de inicio de sesión acoplado generado con URL de registro EC no válida.

temasso
fuente
Lo mismo me pasó a mí. ¡Gracias!
Greendrake
Este fue mi problema. Tenía credenciales de AWS CLI diferentes almacenadas en ~ / .aws / credentials que las aws que administraba. Se recrearon nuevas credenciales y configuraciones que funcionaron.
Martin Algesten el
6

En Windows en PowerShell , use:

Invoke-Expression $(aws ecr get-login --no-include-email)
Igor Akkerman
fuente
esto sigue siendo relevante
Chappie Johnson
5

Tuve este problema con una causa diferente: necesitaba ingresar a un registro no asociado con mi cuenta de AWS (el registro ECR de un cliente). El cliente me había otorgado acceso en la pestaña Permisos para el registro, agregando mi ID de IAM (por ejemplo, arn:aws:iam::{AWS ACCT #}:user/{Username}) como Principal. Traté de iniciar sesión con los pasos habituales:

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

Lo que por supuesto resultó en no basic auth credentials. Como resultado , aws ecr get-logininicia sesión en la ECR para el registro asociado a su inicio de sesión , lo que tiene sentido en retrospectiva. La solución es decir en aws ecr get-loginqué registro (s) desea iniciar sesión.

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

Después de eso, docker pushfunciona bien.

Jason Clark
fuente
Esto tiene sentido. Pero, ¿qué debes pasar en el --profile? Tengo una cuenta personal pero intento ingresar a una cuenta de empresa. En otras palabras, ¿dónde encuentro?profilename
Ciprian Tomoiagă
1
@ CiprianTomoiagă solo debe incluir eso si está utilizando perfiles con nombre. Ver aquí docs.aws.amazon.com/cli/latest/userguide/…
Sergio
5
  1. Asegúrese de haber creado primero el registro ECR.
    Luego, según las instrucciones de comando de inserción de ECR, corte y pegue los siguientes comandos
  2. Ejecute el comando de inicio de sesión de Docker (eval en Mac / Linux omite cortar y pegar)
    eval $(aws ecr get-login --region us-east-1)
    agregue --perfil si utiliza varias cuentas de 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

En caso de error, asegúrese de ejecutar todos los comandos nuevamente. Las credenciales que obtiene aws ecr get-loginson temporales y caducarán.

Jason
fuente
¿Dónde puedo saber qué poner your-profile?
Andy
Puede dejarlo fuera si está utilizando el perfil predeterminado
Jason
Estaba tratando de descubrir cómo no usar el perfil predeterminado. Sin embargo, me di cuenta de que se pueden ingresar perfiles adicionales en los archivos ~/.aws/configy ~/.aws/credentials.
Andy
5

En mi caso, después de ejecutar aws ecr get-login --no-include-email --region *****, simplemente copié el resultado de ese comando con el formulario docker login -u *** -p ************y lo pegó en el indicador. El empuje siguió adelante.

Julien Nyambal
fuente
4

Los documentos de AWS le indican que ejecute el siguiente comando (para la región ap-sureste-2)

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

Cuando me topé con este problema, no estaba claro para mí, en base a esos documentos, que necesita ingresar el resultado de este comando en la terminal y ejecutarlo.

La solución que funcionó para mí fue copiar el resultado al portapapeles con

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

Pegue el resultado en la línea de comando y ejecútelo

Dan Groch
fuente
4

Después de ejecutar este comando:

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

simplemente ejecute el comando de inicio de sesión de Docker desde la salida

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

es la forma en que Docker inicia sesión en ECR

Javier Rodriguez
fuente
3

Este error generalmente se genera si el inicio de sesión de ecr ha fallado. Estoy usando el sistema de Windows y usé "Powershell" en modo Administrador para iniciar sesión en ecr primero.

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

Esto debería mostrar "Inicio de sesión exitoso".

kumarras
fuente
¡gracias! ¿Por qué ayudó esto? Ya estaba iniciando sesión con saml2aws.
influyente
2

Me enfrenté al mismo problema y el error que cometí fue usar la ruta de repositorio incorrecta

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

En el camino anterior, aquí es donde he cometido el error: en "dkr.ecr.us-east-1.amazonaws.com"lugar de "west". Estaba usando " east". Una vez que corregí mi error, pude empujar la imagen con éxito.

karthik vee
fuente
2

El comando docker dado por aws-cli está un poco apagado ...

Al usar el inicio de sesión de Docker, Docker guardará un servidor: par de claves en su llavero o en el archivo ~ / .docker / config.json

Si guarda la clave debajo de https://7272727.dkr.ecr.us-east-1.amazonaws.comla búsqueda de la clave durante la inserción, fallará porque Docker buscará un servidor llamado 7272727.dkr.ecr.us-east-1.amazonaws.comno https://7272727.dkr.ecr.us-east-1.amazonaws.com.

Use el siguiente comando para iniciar sesión:

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

Una vez que ejecute el comando, recibirá un 'Login Succeeded'mensaje y, a continuación, estará bien,
su comando push debería funcionar

Dakshin Rajavel
fuente
2

Hay una manera muy simple de llevar las imágenes de Docker a ECR: Amazon ECR Docker Credential Helper . Simplemente instálelo de acuerdo con la guía provista, actualice su ~/.docker/config.jsoncomo sigue:

{
    "credsStore": "ecr-login"
}

y podrás empujar / tirar tus imágenes sin docker login.

Cepr0
fuente
Recibí el mismo error después de seguir las instrucciones de este artículo.
ryechus
1

Me encontré con este problema también corriendo en OSX. Vi la respuesta de Oliver Salzburg y revisé mi ~ / .docker / config.json. Tenía múltiples credenciales de autorización en su interior de las diferentes cuentas de AWS que tengo. Eliminé el archivo y después de ejecutar get-login nuevamente funcionó.

Minh Tran
fuente
1

Asegúrese de utilizar la región correcta aws ecr get-login, debe coincidir con la región en la que se crea su repositorio.

Lech Migdal
fuente
1

Mi problema era tener múltiples credenciales de AWS; default y dev. Como estaba tratando de implementar para dev esto funcionó:

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

FWIW, Debian 9, Docker versión 18.06.1-ce, compilación e68fc7a:

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

Ligemer
fuente
1

Si usa varios perfiles y necesita iniciar sesión en un perfil que no es el predeterminado, debe iniciar sesión con este comando:

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

El siguiente comando funciona para mí:

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

Y luego ejecuto estos 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
fuente
0

También encontramos este problema hoy y probamos todo lo mencionado en esta publicación (excepto generar credenciales de AWS).

Finalmente resolvimos el problema simplemente actualizando Docker, luego el empuje funcionó.

El problema se encontró con Docker 1.10.x y se resolvió con Docker 1.11.x.

Espero que esto ayude

Baptiste Gaillard
fuente
0

Si está aislando cuentas de AWS para fines de CI / CD y tiene un repositorio ECR compartido entre varias cuentas de AWS, es posible que deba cambiarlo ~/.docker/config.jsonmanualmente.

Digamos que tiene estas configuraciones:

  1. ECR es propiedad de AWS Account ID 00000000000000
  2. El servidor de CI es propiedad de la cuenta de AWS 99999999999999

Si llama aws ecr get-login --region us-west-2 | bashdentro de su servidor CI, Docker generará credenciales temporales en ~/.docker/config.json.

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

Pero desea señalar la cuenta de ECR, por lo que debe cambiar el nombre de host.

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

Tenga en cuenta que esta situación depende de cómo se forma la política / usuario de IAM para permitir el acceso a ECR.

tomodian
fuente
0
aws ecr get-login --region us-west-1 --no-include-email

Este comando me da el comando correcto para iniciar sesión. Si no usa "--no-include-email", arrojará otro error. El resultado del comando anterior se parece a este inicio de sesión de la ventana acoplable -u AWS -p ********************** muy grande ******. Copia eso y ejecútalo. Ahora mostrará "Inicio de sesión correcto". Ahora puede empujar su imagen a ECR.

Asegúrese de que su regla AMI tenga permiso para el usuario que intentó iniciar sesión.

Omar Faroque Anik
fuente