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?

Ville Miekk-oja
fuente
¿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:

{
    "auths": {
            "https://index.docker.io/v1/": {}
    },
    ...

Al cerrar la sesión, esta entrada se elimina:

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

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?

Francesco de Guytenaere
fuente
4
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:

"auths": {
    "private.registry.com": {
        "auth": "gibberishgibberishgibberishgibberishgibberishgibberish"
    }
 }

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:

bash$ docker login private.registry.com
Username (logged-in-user):

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.

Arnab
fuente
13

Puede hacer el siguiente comando para ver el nombre de usuario con el que inició sesión y el registro utilizado:

docker system info | grep -E 'Username|Registry'
Miira ben sghaier
fuente
6

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)
cristiano
fuente
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).

Wilfred Hughes
fuente
5

El esquema de credenciales de docker cli no es sorprendentemente sencillo, solo eche un vistazo:

cat ~/.docker/config.json

{
  "auths": {
    "dockerregistry.myregistry.com": {},
    "https://index.docker.io/v1/": {}

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

{"https://index.docker.io/v1/":"kcd"}
KCD
fuente
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.

todd_dsm
fuente
3

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: Docker conectado

BaluJr.
fuente
1
¿Qué pasa con las versiones de Docker sin la GUI? o sin ventanas?
Zameer Fouzan
1
Entonces tienes que usar uno de los enfoques de las otras respuestas.
BaluJr.
2

Si desea un true/falsevalor simple , puede canalizarlo docker.jsona jq.

is_logged_in() {
  cat ~/.docker/config.json | jq -r --arg url "${REPOSITORY_URL}" '.auths | has($url)'
}

if [[ "$(is_logged_in)" == "false" ]]; then
  # do stuff, log in
fi
mcw
fuente
2
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

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

{
"auths": {
    "HOST_NAME_HERE": {},
    "https://index.docker.io/v1/": {}
},
"HttpHeaders": {
    "User-Agent": "Docker-Client/18.09.0 (windows)"
},
"credsStore": "wincred",
"stackOrchestrator": "swarm"
}
atom88
fuente
0

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!
Oliver
fuente