Cómo saber si Docker ya ha iniciado sesión en un servidor de registro de Docker
116
No estoy seguro si ya inicié sesión en un registro de Docker en la línea cmd usando cmd: inicio de sesión de Docker. ¿Cómo puede probar o ver si ha iniciado sesión o no, sin intentar presionar?
¿No estás seguro de entender tu pregunta? ¿Quiere saber si ha iniciado sesión en un terminal? ¿Por qué no ejecutar el comando % docker images en la terminal y ver si aparecen sus imágenes?
noobuntu
1
Quiero saber si he iniciado sesión en el registro de dockerhub en la terminal. Pensé que las imágenes son locales, por lo que solo mostrará las imágenes locales, no las imágenes de dockerhub.
Ville Miekk-oja
1
Creo que una vez que haya iniciado sesión en Docker, estará conectado a su registro de Dockerhub. No creo que haya un inicio de sesión separado
noobuntu
Respuestas:
64
Editar 2020
Volviendo al problema de github ( cerrado ) , donde se señala, no hay una sesión o estado real;
El inicio de sesión de Docker en realidad no crea ningún tipo de sesión persistente, solo almacena las credenciales del usuario en el disco para que, cuando se requiera autenticación, pueda leerlas para iniciar sesión.
Como han señalado otros, authsse agrega una entrada / nodo al ~/.docker/config.jsonarchivo (esto también funciona para registros privados ) después de iniciar sesión con éxito:
$ docker logout
Removing login credentials for https://index.docker.io/v1/
Contenido de la ventana acoplable config.jsondespués de:
{
"auths": {},
...
Este archivo puede ser analizado por su script o código para verificar su estado de inicio de sesión.
Método alternativo (volver a iniciar sesión)
Puede iniciar sesión en Docker con docker login <repository>
$ docker login
Login with your Docker ID to push and pull images from Docker Hub. If
you don't have a Docker ID, head over to https://hub.docker.com to
create one.
Username:
Si ya ha iniciado sesión, el mensaje se verá así:
$ docker login
Login with your Docker ID to push and pull images from Docker Hub. If
you don't have a Docker ID, head over to https://hub.docker.com to
create one.
Username (myusername): # <-- "myusername"
El último enlace habla de comprobar el contenido de ~/.docker/config.json.
dusan
2
docker infoaparentemente no es confiable incluso para index.docker.io . Actualmente iniciaste sesión bien y solo veo la Registryentrada, no Username.
Famousgarkin
3
La información de la ventana acoplable ya no muestra el nombre de usuario. Estoy en Windows, con la versión 18.05.0-ce de la ventana acoplable.
Giovanni Bassi
3
¿Qué pasa si es necesario comprobar un script?
Teekin
Esto solo funciona para el concentrador principal de Docker, creo. Al realizar la autenticación en cualquier otro repositorio, deberá verificar su archivo config.json.
duane
43
Utilizo una de las dos formas siguientes para esta verificación:
1: Ver archivo config.json:
En caso de que haya iniciado sesión en "private.registry.com", verá una entrada correspondiente a lo siguiente en ~/.docker/config.json:
Si obtiene un resultado como el anterior, significa que logged-in-userya tenía una sesión activa con private.registry.com. Si solo se le solicita el nombre de usuario, eso indicaría que no hay una sesión activa.
Las respuestas aquí hasta ahora no son tan útiles:
docker info ya no proporciona esta información
docker logout es un inconveniente importante, a menos que ya conozca las credenciales y pueda volver a iniciar sesión fácilmente
docker login La respuesta parece bastante poco confiable y no es tan fácil de analizar por el programa.
Mi solución que funcionó para mí se basa en el comentario de @ noobuntu : pensé que si ya conocía la imagen que quiero extraer, pero no estoy seguro de si el usuario ya inició sesión, puedo hacer esto:
try pulling target image
-> on failure:
try logging in
-> on failure: throw CannotLogInException
-> on success:
try pulling target image
-> on failure: throw CannotPullImageException
-> on success: (continue)
-> on success: (continue)
Esta es, con mucho, la mejor estrategia: simplemente intente un tirón, si falla, entonces no está conectado (el resto de la lógica que tenga dependerá de cada caso de uso, pero el primer intento es universalmente aplicable).
Oliver
2
Sin embargo, alguien señaló en github.com/moby/moby/issues/15466 que hay muchas razones de falla, no solo un problema de inicio de sesión, pero el estado de salida de la ventana acoplable no permite diferenciar la razón de la falla. Sigue siendo mejor que las otras soluciones, pero una solución completa requeriría un parche en la ventana acoplable.
Oliver
5
Para los registros privados, no se muestra nada en docker info. Sin embargo, el comando de cierre de sesión le dirá si inició sesión:
$ docker logout private.example.com
Not logged in to private.example.com
(Aunque esto lo obligará a iniciar sesión nuevamente).
Esto existe en Windows (uso Get-Content ~\.docker\config.json) y también puede hurgar en la herramienta de credenciales que también enumera el nombre de usuario ... y creo que incluso puede recuperar la contraseña
. "C:\Program Files\Docker\Docker\resources\bin\docker-credential-wincred.exe" list
En Windows, solo puede ver el nombre de usuario, la contraseña se almacena en el administrador de credenciales (panel de control)
Thorbjørn Ravn Andersen
Supongo que estropearé la sorpresa ... lo docker-credential-wincred.exe <store|get|erase|list|version>que significa que puede get
usar
Ese comando cat debería usar separadores de ruta de linux: cat ~ / .docker / config.json. Esto puede parecer una metedura de pata para algunos, pero otros lectores pueden simplemente copiarlo / pegarlo y probarlo, y no darse cuenta fácilmente de que el error "no existe tal archivo o directorio" se debe a esto. :-)
charlie arehart
@charliearehart subestimas mi pereza, estaba usando el catalias en Powershell ... actualizado para incluir ambos
KCD
@KCD, ah. :-) Gracias por aclararlo.
charlie arehart
4
Recién comprobado, hoy se ve así:
$ docker login
Authenticating with existing credentials...
Login Succeeded
NOTA: esto es en un macOS con la última versión de Docker CE, docker-credential-helper, ambos instalados con homebrew.
Al menos en "Docker para Windows", puede ver si ha iniciado sesión en Docker Hub a través de la interfaz de usuario. Simplemente haga clic con el botón derecho en el icono de la ventana acoplable en el área de notificación de Windows:
Puede jqdevolver un código de salida adecuado y luego no necesita hacer comparaciones de cadenas:is_logged_in() { jq -e --arg url ${ADDRESS} '.auths | has($url)' ~/.docker/config.json > /dev/null; }; if is_logged_in; then ...
Guss
¡Agradable! ¡Gracias!
mcw
1
Utilice el comando como a continuación:
docker info | grep 'name'
WARNING: No swap limit support
Username: <strong>jonasm2009</strong>
Como señaló @Christian, lo mejor es probar la operación primero y luego iniciar sesión solo si es necesario. El problema es que "si es necesario" no es tan obvio para hacerlo con firmeza. Un enfoque es comparar el stderr de la operación de la ventana acoplable con algunas cadenas que se conocen (por prueba y error). Por ejemplo,
try "docker OPERATION"
if it failed:
capture the stderr of "docker OPERATION"
if it ends with "no basic auth credentials":
try docker login
else if it ends with "not found":
fatal error: image name/tag probably incorrect
else if it ends with <other stuff you care to trap>:
...
else:
fatal error: unknown cause
try docker OPERATION again
if this fails: you're SOL!
Respuestas:
Editar 2020
Volviendo al problema de github ( cerrado ) , donde se señala, no hay una sesión o estado real;
Como han señalado otros,
auths
se agrega una entrada / nodo al~/.docker/config.json
archivo (esto también funciona para registros privados ) después de iniciar sesión con éxito:Al cerrar la sesión, esta entrada se elimina:
Contenido de la ventana acoplable
config.json
después de:Este archivo puede ser analizado por su script o código para verificar su estado de inicio de sesión.
Método alternativo (volver a iniciar sesión)
Puede iniciar sesión en Docker con
docker login <repository>
Si ya ha iniciado sesión, el mensaje se verá así:
Para obtener la explicación original de
~/.docker/config.json
, verifique la pregunta: ¿cómo puedo saber si he iniciado sesión en un registro de Docker privado?fuente
~/.docker/config.json
.docker info
aparentemente no es confiable incluso para index.docker.io . Actualmente iniciaste sesión bien y solo veo laRegistry
entrada, noUsername
.Utilizo una de las dos formas siguientes para esta verificación:
1: Ver archivo config.json:
En caso de que haya iniciado sesión en "private.registry.com", verá una entrada correspondiente a lo siguiente en
~/.docker/config.json
:2: Intente iniciar sesión en Docker una vez más:
Si está tratando de ver si ya tiene una sesión activa con private.registry.com, intente iniciar sesión nuevamente:
Si obtiene un resultado como el anterior, significa que
logged-in-user
ya tenía una sesión activa conprivate.registry.com
. Si solo se le solicita el nombre de usuario, eso indicaría que no hay una sesión activa.fuente
Puede hacer el siguiente comando para ver el nombre de usuario con el que inició sesión y el registro utilizado:
fuente
Las respuestas aquí hasta ahora no son tan útiles:
docker info
ya no proporciona esta informacióndocker logout
es un inconveniente importante, a menos que ya conozca las credenciales y pueda volver a iniciar sesión fácilmentedocker login
La respuesta parece bastante poco confiable y no es tan fácil de analizar por el programa.Mi solución que funcionó para mí se basa en el comentario de @ noobuntu : pensé que si ya conocía la imagen que quiero extraer, pero no estoy seguro de si el usuario ya inició sesión, puedo hacer esto:
fuente
Para los registros privados, no se muestra nada en
docker info
. Sin embargo, el comando de cierre de sesión le dirá si inició sesión:(Aunque esto lo obligará a iniciar sesión nuevamente).
fuente
El esquema de credenciales de docker cli no es sorprendentemente sencillo, solo eche un vistazo:
cat ~/.docker/config.json
Esto existe en Windows (uso
Get-Content ~\.docker\config.json
) y también puede hurgar en la herramienta de credenciales que también enumera el nombre de usuario ... y creo que incluso puede recuperar la contraseña. "C:\Program Files\Docker\Docker\resources\bin\docker-credential-wincred.exe" list
fuente
docker-credential-wincred.exe <store|get|erase|list|version>
que significa que puedeget
cat
alias en Powershell ... actualizado para incluir ambosRecién comprobado, hoy se ve así:
NOTA: esto es en un macOS con la última versión de Docker CE, docker-credential-helper, ambos instalados con homebrew.
fuente
Al menos en "Docker para Windows", puede ver si ha iniciado sesión en Docker Hub a través de la interfaz de usuario. Simplemente haga clic con el botón derecho en el icono de la ventana acoplable en el área de notificación de Windows:
fuente
Si desea un
true/false
valor simple , puede canalizarlodocker.json
ajq
.fuente
jq
devolver un código de salida adecuado y luego no necesita hacer comparaciones de cadenas:is_logged_in() { jq -e --arg url ${ADDRESS} '.auths | has($url)' ~/.docker/config.json > /dev/null; }; if is_logged_in; then ...
Utilice el comando como a continuación:
fuente
En Windows, puede inspeccionar las "autorizaciones" de inicio de sesión (auths) mirando este archivo: [USER_HOME_DIR] .docker \ config.json
Ejemplo: c: \ USERS \ YOUR_USERANME.docker \ config.json
Se verá así para las credenciales de Windows
fuente
Como señaló @Christian, lo mejor es probar la operación primero y luego iniciar sesión solo si es necesario. El problema es que "si es necesario" no es tan obvio para hacerlo con firmeza. Un enfoque es comparar el stderr de la operación de la ventana acoplable con algunas cadenas que se conocen (por prueba y error). Por ejemplo,
fuente