Jak sprawdzić, czy docker jest już zalogowany do serwera rejestru Docker

117

Nie jestem pewien, czy już zalogowałem się do rejestru Dockera w linii cmd przy użyciu polecenia cmd: docker login. Jak możesz przetestować lub sprawdzić, czy jesteś zalogowany, czy nie, bez próby naciskania?

Ville Miekk-oja
źródło
Nie jesteś pewien, czy rozumiem Twoje pytanie? chcesz wiedzieć, czy jesteś zalogowany na terminalu? dlaczego nie uruchomić polecenia % docker images w terminalu i sprawdzić, czy twoje obrazy się pojawią?
noobuntu
1
Chcę wiedzieć, czy jestem zalogowany do rejestru dockerhub w terminalu. Wydawało mi się, że obrazy są lokalne, więc pokażą tylko obrazy lokalne, a nie obrazy dockerhub.
Ville Miekk-oja
1
Uważam, że po zalogowaniu się do Dockera zostaniesz połączony z rejestrem Dockerhub. Myślę, że nie ma osobnego logowania
noobuntu

Odpowiedzi:

64

Edytuj 2020

Wracając do ( zamkniętego ) problemu na githubie , gdzie wskazano, że nie ma aktualnej sesji ani stanu;

Docker login w rzeczywistości nie tworzy żadnej trwałej sesji, a jedynie przechowuje dane uwierzytelniające użytkownika na dysku, aby gdy wymagane jest uwierzytelnienie, mógł je odczytać, aby się zalogować

Jak zauważyli inni, authswpis / węzeł jest dodawany do ~/.docker/config.jsonpliku (działa to również w przypadku prywatnych rejestrów) po pomyślnym zalogowaniu:

{
    "auths": {
            "https://index.docker.io/v1/": {}
    },
    ...

Podczas wylogowywania ten wpis jest następnie usuwany:

$ docker logout
Removing login credentials for https://index.docker.io/v1/

Zawartość dockera config.jsonpo:

{
    "auths": {},
    ...

Ten plik może zostać przeanalizowany przez skrypt lub kod, aby sprawdzić stan logowania.

Alternatywna metoda (ponowne logowanie)

Możesz zalogować się do dockera z 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:

Jeśli jesteś już zalogowany, monit będzie wyglądał następująco:

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

Aby uzyskać oryginalne wyjaśnienie ~/.docker/config.json, sprawdź pytanie: jak mogę sprawdzić, czy jestem zalogowany do prywatnego rejestru docker

Francesco de Guytenaere
źródło
4
Ostatni link mówi o sprawdzeniu zawartości ~/.docker/config.json.
dusan
3
docker infojest najwyraźniej zawodny nawet dla index.docker.io . Obecnie zalogowany w porządku i widzę tylko Registrywpis, nie Username.
Famousgarkin
3
informacje dockera nie pokazują już nazwy użytkownika. Używam systemu Windows z wersją docker 18.05.0-ce.
Giovanni Bassi
3
A jeśli skrypt musi sprawdzić?
Teekin,
Myślę, że działa to tylko w przypadku głównego centrum dokowania. Autoryzując się do dowolnego innego repozytorium, musisz sprawdzić plik config.json.
duane
43

Do tego sprawdzenia używam jednego z następujących dwóch sposobów:

1: Wyświetl plik config.json:

Jeśli jesteś zalogowany na „private.registry.com”, zobaczysz wpis taki sam jak następujący w ~/.docker/config.json:

"auths": {
    "private.registry.com": {
        "auth": "gibberishgibberishgibberishgibberishgibberishgibberish"
    }
 }

2: Spróbuj ponownie zalogować się do Dockera:

Jeśli próbujesz sprawdzić, czy masz już aktywną sesję z private.registry.com, spróbuj zalogować się ponownie:

bash$ docker login private.registry.com
Username (logged-in-user):

Jeśli otrzymasz wynik podobny do powyższego, oznacza to, że masz logged-in-userjuż aktywną sesję z private.registry.com. Jeśli zamiast tego zostanie wyświetlony monit o podanie nazwy użytkownika, oznaczałoby to, że nie ma aktywnej sesji.

Arnab
źródło
14

Możesz wykonać następujące polecenie, aby zobaczyć nazwę użytkownika, z którym jesteś zalogowany, i używany rejestr:

docker system info | grep -E 'Username|Registry'
Miira ben sghaier
źródło
6

Dotychczasowe odpowiedzi nie są tak przydatne:

  • docker info nie dostarcza już tych informacji
  • docker logout to poważna niedogodność - chyba że znasz już dane uwierzytelniające i możesz łatwo zalogować się ponownie
  • docker login odpowiedź wydaje się dość zawodna i niełatwa do przeanalizowania przez program

Moje rozwiązanie, które dla mnie zadziałało, opiera się na komentarzu @ noobuntu : pomyślałem, że skoro już znam obraz, który chcę wyciągnąć, ale nie jestem pewien, czy użytkownik jest już zalogowany, mogę to zrobić:

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)
chrześcijanin
źródło
Jest to zdecydowanie najlepsza strategia: po prostu spróbuj wyciągnąć, jeśli się nie powiedzie, to nie zostanie zalogowany (reszta logiki, którą masz, będzie zależeć od każdego przypadku użycia, ale pierwsza próba ma uniwersalne zastosowanie).
Oliver
2
Jednak ktoś zwrócił uwagę na github.com/moby/moby/issues/15466 , że jest wiele przyczyn niepowodzenia, nie tylko problem z logowaniem, ale status wyjścia dockera nie pozwala na rozróżnienie przyczyny niepowodzenia. Nadal jest lepsze niż inne rozwiązania, ale pełne rozwiązanie wymagałoby poprawki do dockera.
Oliver
5

W przypadku rejestrów prywatnych nic nie jest wyświetlane docker info. Jednak polecenie wylogowania poinformuje Cię, czy byłeś zalogowany:

 $ docker logout private.example.com
 Not logged in to private.example.com

(Chociaż to zmusi Cię do ponownego zalogowania).

Wilfred Hughes
źródło
5

Schemat poświadczeń docker cli jest zaskakująco nieskomplikowany, wystarczy spojrzeć:

cat ~/.docker/config.json

{
  "auths": {
    "dockerregistry.myregistry.com": {},
    "https://index.docker.io/v1/": {}

Istnieje w systemie Windows (użyj Get-Content ~\.docker\config.json) i możesz także przeglądać narzędzie poświadczające, które również wyświetla nazwę użytkownika ... i myślę, że możesz nawet odzyskać hasło

. "C:\Program Files\Docker\Docker\resources\bin\docker-credential-wincred.exe" list

{"https://index.docker.io/v1/":"kcd"}
KCD
źródło
W systemie Windows widać tylko nazwę użytkownika, hasło jest przechowywane w menedżerze poświadczeń (panel sterowania)
Thorbjørn Ravn Andersen
Chyba zepsuję niespodziankę ... docker-credential-wincred.exe <store|get|erase|list|version>co oznacza, że ​​możesz getpodać swoje hasło
KCD,
To polecenie cat powinno używać linuksowych separatorów ścieżek: cat ~ / .docker / config.json. Niektórym może się to wydawać trudne, ale inni czytelnicy mogą go po prostu skopiować / wkleić i wypróbować, nie zdając sobie od razu sprawy z tego, że przyczyną jest błąd „brak takiego pliku lub katalogu”. :-)
charlie arehart
@charliearehart nie doceniasz mojego lenistwa, używałem cataliasu w Powershell ... zaktualizowano, aby obejmował oba
KCD
@KCD, ah. :-) Dzięki za wytłumaczenie.
Charlie Arehart
4

Właśnie sprawdzone, dziś wygląda to tak:

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

UWAGA: dotyczy to systemu macOS z najnowszą wersją Docker CE, docker-credential-helper - oba instalowane z homebrew.

todd_dsm
źródło
3

Przynajmniej w „Docker for Windows” możesz sprawdzić, czy jesteś zalogowany do docker hub przez interfejs użytkownika. Wystarczy kliknąć prawym przyciskiem myszy ikonę Dockera w obszarze powiadomień systemu Windows: Docker zalogowany

BaluJr.
źródło
1
a co z wersjami dockera bez GUI? lub bez okien?
Zameer Fouzan
1
Następnie musisz użyć jednego z podejść z innych odpowiedzi.
BaluJr.
2

Jeśli chcesz mieć prostą true/falsewartość, możesz przesłać ją docker.jsondo 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
mcw
źródło
2
Możesz jqzwrócić poprawny kod wyjścia, a wtedy nie musisz robić porównań ciągów:is_logged_in() { jq -e --arg url ${ADDRESS} '.auths | has($url)' ~/.docker/config.json > /dev/null; }; if is_logged_in; then ...
Guss
Miły! Dziękuję Ci!
mcw
1

Użyj polecenia jak poniżej:

docker info | grep 'name'

WARNING: No swap limit support
Username: <strong>jonasm2009</strong>
Meng Jonas
źródło
Jeśli jesteś już zalogowany do rejestru Dockera, po prostu użyj ! [Tutaj wprowadź opis obrazu ] ( i.stack.imgur.com/JkCxn.png ) Zobaczysz odpowiedź.
Meng Jonas
1

W systemie Windows możesz sprawdzić „autoryzacje” logowania (auths), przeglądając ten plik: [USER_HOME_DIR] .docker \ config.json

Przykład: c: \ USERS \ YOUR_USERANME.docker \ config.json

W przypadku poświadczeń systemu Windows będzie to wyglądać mniej więcej tak

{
"auths": {
    "HOST_NAME_HERE": {},
    "https://index.docker.io/v1/": {}
},
"HttpHeaders": {
    "User-Agent": "Docker-Client/18.09.0 (windows)"
},
"credsStore": "wincred",
"stackOrchestrator": "swarm"
}
atom88
źródło
0

Jak wskazał @Christian, najlepiej najpierw wypróbować operację, a następnie zalogować się tylko w razie potrzeby. Problem polega na tym, że solidne wykonanie zadania „w razie potrzeby” nie jest takie oczywiste. Jednym podejściem jest porównanie standardowego błędu operacji dockera z niektórymi znanymi ciągami znaków (metodą prób i błędów). Na przykład,

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!
Oliver
źródło