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:
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"
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.
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
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
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.
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:
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>
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!
Odpowiedzi:
Edytuj 2020
Wracając do ( zamkniętego ) problemu na githubie , gdzie wskazano, że nie ma aktualnej sesji ani stanu;
Jak zauważyli inni,
auths
wpis / węzeł jest dodawany do~/.docker/config.json
pliku (działa to również w przypadku prywatnych rejestrów) po pomyślnym zalogowaniu:Podczas wylogowywania ten wpis jest następnie usuwany:
Zawartość dockera
config.json
po: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>
Jeśli jesteś już zalogowany, monit będzie wyglądał następująco:
Aby uzyskać oryginalne wyjaśnienie
~/.docker/config.json
, sprawdź pytanie: jak mogę sprawdzić, czy jestem zalogowany do prywatnego rejestru dockerźródło
~/.docker/config.json
.docker info
jest najwyraźniej zawodny nawet dla index.docker.io . Obecnie zalogowany w porządku i widzę tylkoRegistry
wpis, nieUsername
.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
: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:
Jeśli otrzymasz wynik podobny do powyższego, oznacza to, że masz
logged-in-user
już aktywną sesję zprivate.registry.com
. Jeśli zamiast tego zostanie wyświetlony monit o podanie nazwy użytkownika, oznaczałoby to, że nie ma aktywnej sesji.źródło
Możesz wykonać następujące polecenie, aby zobaczyć nazwę użytkownika, z którym jesteś zalogowany, i używany rejestr:
źródło
Dotychczasowe odpowiedzi nie są tak przydatne:
docker info
nie dostarcza już tych informacjidocker logout
to poważna niedogodność - chyba że znasz już dane uwierzytelniające i możesz łatwo zalogować się ponowniedocker login
odpowiedź wydaje się dość zawodna i niełatwa do przeanalizowania przez programMoje 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ć:
źródło
W przypadku rejestrów prywatnych nic nie jest wyświetlane
docker info
. Jednak polecenie wylogowania poinformuje Cię, czy byłeś zalogowany:(Chociaż to zmusi Cię do ponownego zalogowania).
źródło
Schemat poświadczeń docker cli jest zaskakująco nieskomplikowany, wystarczy spojrzeć:
cat ~/.docker/config.json
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
źródło
docker-credential-wincred.exe <store|get|erase|list|version>
co oznacza, że możeszget
podać swoje hasłocat
aliasu w Powershell ... zaktualizowano, aby obejmował obaWłaśnie sprawdzone, dziś wygląda to tak:
UWAGA: dotyczy to systemu macOS z najnowszą wersją Docker CE, docker-credential-helper - oba instalowane z homebrew.
źródło
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:
źródło
Jeśli chcesz mieć prostą
true/false
wartość, możesz przesłać jądocker.json
dojq
.źródło
jq
zwró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 ...
Użyj polecenia jak poniżej:
źródło
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
źródło
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,
źródło