Je ne sais pas si je me suis déjà connecté à un registre docker dans la ligne de commande en utilisant cmd: docker login. Comment pouvez-vous tester ou voir si vous êtes connecté ou non, sans essayer de pousser?
J'utilise l'une des deux manières suivantes pour cette vérification:
Si vous êtes connecté à "private.registry.com", vous verrez une entrée identique à celle qui suit dans ~/.docker/config.json
:
"auths": {
"private.registry.com": {
"auth": "gibberishgibberishgibberishgibberishgibberishgibberish"
}
}
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 celle ci-dessus, cela signifie que logged-in-user
avait déjà une session active avec private.registry.com
. Si vous êtes simplement promu pour le nom d'utilisateur, cela indiquerait qu'il n'y a pas de session active.
Le schéma d’accréditation de docker cli n’est pas surprenant, il suffit de regarder:
cat ~\.docker\config.json
{
"auths": {
"dockerregistry.myregistry.com": {},
"https://index.docker.io/v1/": {}
Sous Windows, vous pouvez également explorer l’outil des informations d’identification, qui répertorie également le nom d’utilisateur, pour en faire un peu trop;)
. "C:\Program Files\Docker\Docker\resources\bin\docker-credential-wincred.exe" list
{"https://index.docker.io/v1/":"kcd"}
Pour les registres privés, rien n’est affiché dans docker info
. Cependant, la commande de déconnexion vous dira si vous êtes connecté:
$ docker logout private.example.com
Not logged in to private.example.com
(Bien que cela vous oblige à vous reconnecter.)
Les réponses ici jusqu'à présent ne sont pas si utiles:
docker info
ne fournit plus cette informationdocker logout
est un inconvénient majeur - sauf si vous connaissez déjà les informations d'identification et pouvez facilement vous reconnecterdocker login
semble relativement peu fiable et difficile à analyser par le programmeMa solution qui a fonctionné pour moi s'appuie sur le commentaire de @ noobuntu : Je me suis dit que si je connaissais déjà l'image que je voulais 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)
Vous pouvez utiliser 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'
Sous Windows, vous pouvez consulter les "autorisations" de connexion (autorisations) en consultant le fichier: [USER_HOME_DIR] .docker\config.json
Exemple: c:\USERS\YOUR_USERANME.docker\config.json
Cela ressemblera à quelque chose comme ceci 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"
}
Utilisez la commande comme ci-dessous:
docker info | grep 'name'
WARNING: No swap limit support
Username: <strong>jonasm2009</strong>
Je viens de vérifier, aujourd'hui cela ressemble à ceci:
$ docker login
Authenticating with existing credentials...
Login Succeeded
REMARQUE: il s'agit d'un macOS doté de la dernière version de Docker CE, docker-credential-helper - tous deux installés avec homebrew.
Si vous voulez une valeur true/false
simple, vous pouvez diriger votre docker.json
vers 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
Comme l'a souligné @Christian, il est préférable d'essayer l'opération en premier lieu, puis de vous connecter uniquement si nécessaire. Le problème est que "si nécessaire" n'est pas si évident de le faire avec robustesse. Une approche consiste à comparer le fonctionnement du menu fixe 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!