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?
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?
Réponses:
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 auths
entrée / un nœud est ajouté au ~/.docker/config.json
fichier (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.json
après:
{
"auths": {},
...
Ce fichier peut être analysé par votre script ou code pour vérifier votre statut de connexion.
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é
~/.docker/config.json
.
docker info
n'est apparemment pas fiable même pour index.docker.io . Actuellement connecté bien et ne voir que l' Registry
entrée, non Username
.
J'utilise l'une des deux méthodes suivantes pour cette vérification:
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"
}
}
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-user
dé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.
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'
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
la réponse semble assez peu fiable et pas si facile à analyser par le programmeMa 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)
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.)
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"}
docker-credential-wincred.exe <store|get|erase|list|version>
ce qui signifie que vous pouvez get
votre mot de passe
cat
alias dans Powershell ... mis à jour pour inclure les deux
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:
Si vous voulez une true/false
valeur 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
jq
renvoyé 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 ...
Utilisez la commande comme ci-dessous:
docker info | grep 'name'
WARNING: No swap limit support
Username: <strong>jonasm2009</strong>
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"
}
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!