Non sono sicuro di aver già effettuato l'accesso a un registro docker nella riga cmd utilizzando cmd: docker login. Come puoi testare o vedere se sei loggato o meno, senza provare a premere?
Non sono sicuro di aver già effettuato l'accesso a un registro docker nella riga cmd utilizzando cmd: docker login. Come puoi testare o vedere se sei loggato o meno, senza provare a premere?
Risposte:
Modifica 2020
Facendo riferimento al problema di github ( chiuso ) , dove viene sottolineato, non esiste una sessione o uno stato effettivo;
il login docker in realtà non sta creando alcun tipo di sessione persistente, ma memorizza solo le credenziali dell'utente su disco in modo che quando è richiesta l'autenticazione possa leggerle per accedere
Come altri hanno sottolineato, una auths
voce / nodo viene aggiunto al ~/.docker/config.json
file (questo funziona anche per i registri privati ) dopo aver effettuato correttamente l'accesso:
{
"auths": {
"https://index.docker.io/v1/": {}
},
...
Quando ci si disconnette, questa voce viene quindi rimossa:
$ docker logout
Removing login credentials for https://index.docker.io/v1/
Contenuto della finestra mobile config.json
dopo:
{
"auths": {},
...
Questo file può essere analizzato dallo script o dal codice per controllare lo stato di accesso.
Puoi accedere a 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:
Se hai già effettuato l'accesso, il prompt sarà simile a:
$ 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"
Per la spiegazione originale ~/.docker/config.json
, controlla la domanda: come posso sapere se ho effettuato l'accesso a un registro di finestra mobile privato
~/.docker/config.json
.
docker info
è apparentemente inaffidabile anche per index.docker.io . Attualmente loggato bene e vedi solo la Registry
voce, no Username
.
Uso uno dei due modi seguenti per questo controllo:
Nel caso tu abbia effettuato l'accesso a "private.registry.com" vedrai una voce per lo stesso come segue in ~/.docker/config.json
:
"auths": {
"private.registry.com": {
"auth": "gibberishgibberishgibberishgibberishgibberishgibberish"
}
}
Se stai cercando di vedere se hai già una sessione attiva con private.registry.com, prova ad accedere di nuovo:
bash$ docker login private.registry.com
Username (logged-in-user):
Se ottieni un output come quello sopra, significa logged-in-user
già avuto una sessione attiva con private.registry.com
. Se invece ti viene richiesto solo il nome utente, ciò indicherebbe che non c'è una sessione attiva.
Puoi eseguire il seguente comando per vedere il nome utente con cui hai effettuato l'accesso e il registro utilizzato:
docker system info | grep -E 'Username|Registry'
Le risposte qui finora non sono così utili:
docker info
non fornisce più queste informazionidocker logout
è un grosso inconveniente, a meno che tu non conosca già le credenziali e possa facilmente accedere nuovamentedocker login
la risposta sembra abbastanza inaffidabile e non così facile da analizzare dal programmaLa mia soluzione che ha funzionato per me si basa sul commento di @ noobuntu : ho pensato che se conoscevo già l'immagine che voglio estrarre, ma non sono sicuro che l'utente sia già loggato, posso farlo:
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)
Per i registri privati, non viene mostrato nulla docker info
. Tuttavia, il comando logout ti dirà se hai effettuato l'accesso:
$ docker logout private.example.com
Not logged in to private.example.com
(Anche se questo ti costringerà ad accedere di nuovo.)
Lo schema delle credenziali di docker cli non è sorprendentemente semplice, basta dare un'occhiata:
cat ~/.docker/config.json
{
"auths": {
"dockerregistry.myregistry.com": {},
"https://index.docker.io/v1/": {}
Questo esiste su Windows (usa Get-Content ~\.docker\config.json
) e puoi anche curiosare nello strumento delle credenziali che elenca anche il nome utente ... e penso che tu possa persino recuperare la password
. "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>
che significa che puoi inserire la get
tua password
cat
alias in Powershell ... aggiornato per includere entrambi
Almeno in "Docker per Windows" puoi vedere se hai effettuato l'accesso all'hub Docker tramite l'interfaccia utente. Basta fare clic con il pulsante destro del mouse sull'icona della finestra mobile nell'area di notifica di Windows:
Se desideri un true/false
valore semplice , puoi reindirizzarlo docker.json
a 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
restituire un codice di uscita corretto e quindi non è necessario eseguire confronti di stringhe:is_logged_in() { jq -e --arg url ${ADDRESS} '.auths | has($url)' ~/.docker/config.json > /dev/null; }; if is_logged_in; then ...
Usa il comando come di seguito:
docker info | grep 'name'
WARNING: No swap limit support
Username: <strong>jonasm2009</strong>
Su Windows puoi controllare le "autorizzazioni" di accesso (auths) guardando questo file: [USER_HOME_DIR] .docker \ config.json
Esempio: c: \ USERS \ YOUR_USERANME.docker \ config.json
Sarà simile a questo per le credenziali di Windows
{
"auths": {
"HOST_NAME_HERE": {},
"https://index.docker.io/v1/": {}
},
"HttpHeaders": {
"User-Agent": "Docker-Client/18.09.0 (windows)"
},
"credsStore": "wincred",
"stackOrchestrator": "swarm"
}
Come sottolineato da @Christian, è meglio provare prima l'operazione, quindi accedere solo se necessario. Il problema è che "se necessario" non è così ovvio da fare in modo robusto. Un approccio consiste nel confrontare lo stderr dell'operazione docker con alcune stringhe note (per tentativi ed errori). Per esempio,
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!