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?


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


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.


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'

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)

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


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

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.


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


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

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

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

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!
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.