Comment savoir si Docker est déjà connecté à un serveur de registre Docker

116

Je ne sais pas si je me suis déjà connecté à un registre Docker dans la ligne cmd en utilisant cmd: docker login. Comment pouvez-vous tester ou voir si vous êtes connecté ou non, sans essayer de pousser?

Ville Miekk-oja
la source
Vous n'êtes pas sûr de comprendre votre question? voulez-vous savoir si vous êtes connecté sur un terminal? pourquoi ne pas exécuter la commande % docker images dans le terminal et voir si vos images s'affichent?
noobuntu
1
Je veux savoir si je suis connecté au registre dockerhub dans le terminal. Je pensais que les images étaient locales, donc cela affichera simplement les images locales, pas les images du dockerhub.
Ville Miekk-oja
1
Je crois qu'une fois que vous êtes connecté à docker, vous êtes connecté à votre registre dockerhub. Je ne pense pas qu'il y ait une connexion séparée
noobuntu

Réponses:

64

Modifier 2020

En se référant au problème github ( fermé ) , où il est signalé, il n'y a pas de session ou d'état réel;

La connexion docker ne crée en fait aucune sorte de session persistante, elle ne stocke que les informations d'identification de l'utilisateur sur le disque afin que, lorsque l'authentification est requise, il puisse les lire pour se connecter

Comme d'autres l'ont souligné, une authsentrée / un nœud est ajouté au ~/.docker/config.jsonfichier (cela fonctionne également pour les registres privés ) une fois que vous vous êtes connecté avec succès:

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

Lors de la déconnexion, cette entrée est ensuite supprimée:

$ docker logout
Removing login credentials for https://index.docker.io/v1/

Contenu du docker config.jsonaprès:

{
    "auths": {},
    ...

Ce fichier peut être analysé par votre script ou code pour vérifier votre statut de connexion.

Méthode alternative (reconnexion)

Vous pouvez vous connecter à Docker avec 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 vous êtes déjà connecté, l'invite ressemblera à ceci:

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

Pour obtenir l'explication originale de la ~/.docker/config.json, vérifiez la question: comment puis-je savoir si je suis connecté à un registre docker privé

Francesco de Guytenaere
la source
4
Le dernier lien parle de vérifier le contenu de ~/.docker/config.json.
dusan
3
docker infon'est apparemment pas fiable même pour index.docker.io . Actuellement connecté bien et ne voir que l' Registryentrée, non Username.
famousgarkin
3
Les informations du docker ne montrent plus le nom d'utilisateur. Je suis sous Windows, avec la version docker 18.05.0-ce.
Giovanni Bassi
3
Que faire si un script doit vérifier?
Teekin
Cela ne fonctionne que pour le hub principal de docker, je pense. En vous authentifiant sur n'importe quel autre dépôt, vous devrez vérifier votre fichier config.json.
duane
43

J'utilise l'une des deux méthodes suivantes pour cette vérification:

1: Afficher le fichier config.json:

Si vous êtes connecté à "private.registry.com", vous verrez une entrée pour la même chose que la suivante dans ~/.docker/config.json:

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

2: Essayez à nouveau de vous connecter au docker:

Si vous essayez de voir si vous avez déjà une session active avec private.registry.com, essayez de vous connecter à nouveau:

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

Si vous obtenez une sortie comme ci-dessus, cela signifie que vous avez logged-in-userdéjà eu une session active avec private.registry.com. Si vous êtes simplement invité à entrer un nom d'utilisateur à la place, cela indique qu'il n'y a pas de session active.

Arnab
la source
14

Vous pouvez exécuter la commande suivante pour voir le nom d'utilisateur avec lequel vous êtes connecté et le registre utilisé:

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

Les réponses ici jusqu'à présent ne sont pas si utiles:

  • docker info ne fournit plus cette information
  • docker logout est un inconvénient majeur - sauf si vous connaissez déjà les informations d'identification et pouvez facilement vous reconnecter
  • docker login la réponse semble assez peu fiable et pas si facile à analyser par le programme

Ma solution qui a fonctionné pour moi s'appuie sur le commentaire de @ noobuntu : j'ai pensé que si je connaissais déjà l'image que je veux extraire, mais je ne suis pas sûr que l'utilisateur soit déjà connecté, je peux le faire:

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)
Christian
la source
C'est de loin la meilleure stratégie: essayez simplement un pull, s'il échoue, il n'est pas connecté (le reste de la logique dépendra de chaque cas d'utilisation, mais le premier essai est universellement applicable).
Oliver
2
Cependant, quelqu'un a souligné sur github.com/moby/moby/issues/15466 qu'il existe de nombreuses raisons d'échec, pas seulement un problème de connexion, mais l'état de sortie du docker ne permet pas de différencier la raison de l'échec. C'est toujours mieux que les autres solutions, mais une solution complète nécessiterait un correctif pour docker.
Oliver
5

Pour les registres privés, rien n'est affiché dans docker info. Cependant, la commande de déconnexion vous indiquera si vous étiez connecté:

 $ docker logout private.example.com
 Not logged in to private.example.com

(Bien que cela vous oblige à vous connecter à nouveau.)

Wilfred Hughes
la source
5

Le schéma d'informations d'identification docker cli est sans surprise, il suffit de jeter un coup d'œil:

cat ~/.docker/config.json

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

Cela existe sur Windows (utilisation Get-Content ~\.docker\config.json) et vous pouvez également fouiller dans l'outil d'identification qui répertorie également le nom d'utilisateur ... et je pense que vous pouvez même récupérer le mot de passe

. "C:\Program Files\Docker\Docker\resources\bin\docker-credential-wincred.exe" list

{"https://index.docker.io/v1/":"kcd"}
KCD
la source
Sur Windows, vous ne pouvez voir que le nom d'utilisateur, le mot de passe est stocké dans le gestionnaire des informations d'identification (panneau de configuration)
Thorbjørn Ravn Andersen
Je suppose que je vais gâcher la surprise ... docker-credential-wincred.exe <store|get|erase|list|version>ce qui signifie que vous pouvez getvotre mot de passe
KCD
Cette commande cat devrait utiliser des séparateurs de chemin Linux: cat ~ / .docker / config.json. Cela peut sembler difficile à certains, mais d'autres lecteurs pourraient simplement le copier / coller et l'essayer, sans se rendre compte facilement que l'erreur "aucun fichier ou répertoire de ce type" est due à cela. :-)
charlie arehart le
@charliearehart vous sous-estimez ma paresse, j'utilisais l' catalias dans Powershell ... mis à jour pour inclure les deux
KCD
@KCD, ah. :-) Merci de clarifier.
Charlie Arehart
4

Je viens de vérifier, aujourd'hui cela ressemble à ceci:

$ docker login
Authenticating with existing credentials...
Login Succeeded

REMARQUE: ceci est sur un macOS avec la dernière version de Docker CE, docker-credential-helper - tous deux installés avec homebrew.

todd_dsm
la source
3

Au moins dans "Docker pour Windows", vous pouvez voir si vous êtes connecté au hub docker via l'interface utilisateur. Faites un clic droit sur l'icône du menu fixe dans la zone de notification Windows: Docker connecté

BaluJr.
la source
1
qu'en est-il des versions de docker sans l'interface graphique? ou non-windows?
Zameer Fouzan
1
Ensuite, vous devez utiliser l'une des approches des autres réponses.
BaluJr.
2

Si vous voulez une true/falsevaleur simple , vous pouvez diriger votre docker.jsonvers 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
la source
2
Vous pouvez avoir jqrenvoyé un code de sortie approprié et vous n'avez pas besoin de faire de comparaisons de chaînes:is_logged_in() { jq -e --arg url ${ADDRESS} '.auths | has($url)' ~/.docker/config.json > /dev/null; }; if is_logged_in; then ...
Guss
Agréable! Je vous remercie!
mcw le
1

Utilisez la commande comme ci-dessous:

docker info | grep 'name'

WARNING: No swap limit support
Username: <strong>jonasm2009</strong>
Meng Jonas
la source
Si vous êtes déjà connecté à un registre docker, utilisez simplement ! [Entrez la description de l'image ici ] ( i.stack.imgur.com/JkCxn.png ) Vous verrez la réponse.
Meng Jonas
1

Sous Windows, vous pouvez inspecter les "autorisations" de connexion (auths) en consultant ce fichier: [USER_HOME_DIR] .docker \ config.json

Exemple: c: \ USERS \ YOUR_USERANME.docker \ config.json

Cela ressemblera à quelque chose comme ça pour les informations d'identification Windows

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

Comme l'a souligné @Christian, il est préférable d'essayer d'abord l'opération, puis de ne se connecter que si nécessaire. Le problème est que "si nécessaire" n'est pas si évident à faire de manière robuste. Une approche consiste à comparer le stderr de l'opération docker avec certaines chaînes connues (par essais et erreurs). Par exemple,

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
la source