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?


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é


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.


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'

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)

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


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

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.


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é


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

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

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

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!
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.