Come sapere se Docker è già connesso a un server del registro Docker


116

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 sei sicuro di aver capito la tua domanda? vuoi sapere se sei loggato su un terminale? perché non eseguire il comando % docker images nel terminale e vedere se le tue immagini vengono visualizzate?
noobuntu

1
Voglio sapere se ho effettuato l'accesso al registro dockerhub nel terminale. Pensavo che le immagini fossero locali, quindi mostrerà solo le immagini locali, non le immagini Dockerhub.
Ville Miekk-oja

1
Credo che una volta effettuato l'accesso a docker, sarai connesso al tuo registro dockerhub. Non credo ci sia un login separato
noobuntu

Risposte:


64

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 authsvoce / nodo viene aggiunto al ~/.docker/config.jsonfile (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.jsondopo:

{
    "auths": {},
    ...

Questo file può essere analizzato dallo script o dal codice per controllare lo stato di accesso.

Metodo alternativo (ri-login)

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


4
L'ultimo collegamento parla del controllo dei contenuti di ~/.docker/config.json.
dusan

3
docker infoè apparentemente inaffidabile anche per index.docker.io . Attualmente loggato bene e vedi solo la Registryvoce, no Username.
Famousgarkin

3
le informazioni sulla finestra mobile non mostrano più il nome utente. Sono su Windows, con la versione docker 18.05.0-ce.
Giovanni Bassi

3
Cosa succede se uno script deve essere controllato?
Teekin

Questo funziona solo per l'hub docker principale, credo. Authing in qualsiasi altro repository dovrai controllare il tuo file config.json.
duane

43

Uso uno dei due modi seguenti per questo controllo:

1: Visualizza il file config.json:

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

2: prova di nuovo il login alla finestra mobile:

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.


14

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'

6

Le risposte qui finora non sono così utili:

  • docker info non fornisce più queste informazioni
  • docker logout è un grosso inconveniente, a meno che tu non conosca già le credenziali e possa facilmente accedere nuovamente
  • docker login la risposta sembra abbastanza inaffidabile e non così facile da analizzare dal programma

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

Questa è di gran lunga la migliore strategia: basta provare un pull, se fallisce allora non è loggato (il resto della logica che hai dipenderà da ogni caso d'uso, ma il primo tentativo è universalmente applicabile).
Oliver

2
Tuttavia qualcuno ha sottolineato su github.com/moby/moby/issues/15466 che ci sono molte ragioni per il fallimento, non solo il problema di accesso, ma lo stato di uscita della finestra mobile non consente di differenziare il motivo del fallimento. È comunque migliore delle altre soluzioni, ma una soluzione completa richiederebbe una patch per docker.
Oliver

5

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


5

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

Su Windows puoi vedere solo il nome utente, la password è memorizzata nel gestore delle credenziali (pannello di controllo)
Thorbjørn Ravn Andersen

Immagino di rovinare la sorpresa ... il docker-credential-wincred.exe <store|get|erase|list|version>che significa che puoi inserire la gettua password
KCD

Quel comando cat dovrebbe usare i separatori di percorso Linux: cat ~ / .docker / config.json. Questo può sembrare un pignolo per alcuni, ma altri lettori potrebbero semplicemente copiarlo / incollarlo e provarlo, e non rendersi subito conto che l'errore "nessun file o directory di questo tipo" è dovuto a questo. :-)
charlie arehart

@charliearehart hai sottovalutato la mia pigrizia, stavo usando l' catalias in Powershell ... aggiornato per includere entrambi
KCD

@ KCD, ah. :-) Grazie per il chiarimento.
charlie arehart il

4

Appena controllato, oggi sembra così:

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

NOTA: questo è su un macOS con l'ultima versione di Docker CE, docker-credential-helper - entrambi installati con homebrew.


3

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: Docker Accesso eseguito


1
che dire delle versioni docker senza GUI? o non Windows?
Zameer Fouzan

1
Quindi devi usare uno degli approcci delle altre risposte.
BaluJr.

2

Se desideri un true/falsevalore semplice , puoi reindirizzarlo docker.jsona 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
È possibile jqrestituire 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 ...
Guss

Bello! Grazie!
mcw


1

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

0

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!
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.