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.


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


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.


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.


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

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

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


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


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!


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 .


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.


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


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.


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.


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


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


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


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


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


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


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.


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


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.


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

1

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

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


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)

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

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


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.



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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.