Erfahren Sie, ob Docker bereits bei einem Docker-Registrierungsserver angemeldet ist


116

Ich bin nicht sicher, ob ich mich bereits mit cmd: docker login bei einer Docker-Registrierung in cmd-Zeile angemeldet habe. Wie können Sie testen oder sehen, ob Sie angemeldet sind oder nicht, ohne zu pushen?


Nicht sicher, ob ich Ihre Frage verstehe? Möchten Sie wissen, ob Sie an einem Terminal angemeldet sind? Warum nicht den Befehl % docker images im Terminal ausführen und prüfen, ob Ihre Bilder angezeigt werden?
Noobuntu

1
Ich möchte wissen, ob ich bei der Dockerhub-Registrierung im Terminal angemeldet bin. Ich dachte, die Bilder sind lokal, daher werden nur die lokalen Bilder angezeigt, nicht die Dockerhub-Bilder.
Ville Miekk-oja

1
Ich glaube, sobald Sie bei Docker angemeldet sind, sind Sie mit Ihrer Dockerhub-Registrierung verbunden. Ich glaube nicht, dass es einen separaten Login gibt
noobuntu

Antworten:


63

Bearbeiten Sie 2020

Unter Bezugnahme auf das ( geschlossene ) Github- Problem, auf das hingewiesen wird, gibt es keine tatsächliche Sitzung oder keinen tatsächlichen Status.

Die Docker-Anmeldung erstellt eigentlich keine dauerhafte Sitzung, sondern speichert nur die Anmeldeinformationen des Benutzers auf der Festplatte, damit er sie bei Anmeldung lesen kann, um sich anzumelden

Wie andere bereits erwähnt haben, authswird der ~/.docker/config.jsonDatei ein Eintrag / Knoten hinzugefügt (dies funktioniert auch für private Registrierungen), nachdem Sie sich erfolgreich angemeldet haben:

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

Beim Abmelden wird dieser Eintrag dann entfernt:

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

Inhalt des Dockers config.jsonnach:

{
    "auths": {},
    ...

Diese Datei kann von Ihrem Skript oder Code analysiert werden, um Ihren Anmeldestatus zu überprüfen.

Alternative Methode (erneutes Anmelden)

Sie können sich bei Docker mit anmelden 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:

Wenn Sie bereits angemeldet sind, sieht die Eingabeaufforderung folgendermaßen aus:

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

~/.docker/config.jsonÜberprüfen Sie die ursprüngliche Erklärung für die Frage: Wie kann ich feststellen, ob ich in einer privaten Docker-Registrierung angemeldet bin?


4
Der letzte Link befasst sich mit der Überprüfung des Inhalts von ~/.docker/config.json.
Dusan

2
docker infoist anscheinend sogar für index.docker.io unzuverlässig . Derzeit in Ordnung eingeloggt und nur den RegistryEintrag sehen, Nr Username.
berühmte Garkin

3
Docker-Informationen zeigen keinen Benutzernamen mehr an. Ich bin unter Windows mit Docker-Version 18.05.0-ce.
Giovanni Bassi

3
Was ist, wenn ein Skript überprüft werden muss?
Teekin

Dies funktioniert nur für den Haupt-Docker-Hub, denke ich. Wenn Sie zu einem anderen Repo wechseln, müssen Sie Ihre Datei config.json überprüfen.
Duane

43

Ich benutze eine der folgenden zwei Möglichkeiten für diese Prüfung:

1: Datei config.json anzeigen:

Wenn Sie bei "private.registry.com" angemeldet sind, wird ein Eintrag für den folgenden Eintrag angezeigt ~/.docker/config.json:

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

2: Versuchen Sie erneut, sich anzumelden:

Wenn Sie versuchen festzustellen, ob Sie bereits eine aktive Sitzung mit private.registry.com haben, versuchen Sie erneut, sich anzumelden:

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

Wenn Sie eine Ausgabe wie oben erhalten, bedeutet dies, dass logged-in-userbereits eine aktive Sitzung mit stattgefunden hat private.registry.com. Wenn Sie stattdessen nur zur Eingabe des Benutzernamens aufgefordert werden, bedeutet dies, dass keine Sitzung aktiv ist.


13

Mit dem folgenden Befehl können Sie den Benutzernamen, mit dem Sie angemeldet sind, und die verwendete Registrierung anzeigen:

docker system info | grep -E 'Username|Registry'

6

Die Antworten hier sind bisher nicht so nützlich:

  • docker info bietet diese Informationen nicht mehr an
  • docker logout Dies ist eine große Unannehmlichkeit - es sei denn, Sie kennen die Anmeldeinformationen bereits und können sich problemlos erneut anmelden
  • docker login Die Antwort scheint ziemlich unzuverlässig und vom Programm nicht so einfach zu analysieren

Meine Lösung, die für mich funktioniert hat, baut auf @ noobuntus Kommentar auf : Ich dachte, wenn ich das Bild, das ich ziehen möchte, bereits kenne, aber nicht sicher bin, ob der Benutzer bereits angemeldet ist, kann ich Folgendes tun:

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)

Dies ist bei weitem die beste Strategie: Versuchen Sie es einfach mit einem Pull. Wenn dies fehlschlägt, ist es nicht angemeldet (der Rest der Logik hängt von jedem Anwendungsfall ab, aber der erste Versuch ist universell anwendbar).
Oliver

2
Auf github.com/moby/moby/issues/15466 hat jedoch jemand darauf hingewiesen, dass es viele Gründe für einen Fehler gibt, nicht nur ein Anmeldeproblem, aber der Docker-Exit-Status erlaubt es nicht, den Grund für einen Fehler zu unterscheiden. Es ist immer noch besser als die anderen Lösungen, aber eine vollständige Lösung würde einen Patch zum Andocken erfordern.
Oliver

5

Bei privaten Registern wird nichts angezeigt docker info. Der Befehl zum Abmelden teilt Ihnen jedoch mit, ob Sie angemeldet waren:

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

(Dies zwingt Sie jedoch dazu, sich erneut anzumelden.)


5

Das Docker-Cli-Berechtigungsschema ist nicht überraschend unkompliziert. Schauen Sie sich das an:

cat ~/.docker/config.json

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

Dies gibt es unter Windows (Verwendung Get-Content ~\.docker\config.json) und Sie können auch das Anmeldeinformationstool durchsuchen, in dem auch der Benutzername aufgeführt ist ... und ich denke, Sie können sogar das Kennwort abrufen

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

{"https://index.docker.io/v1/":"kcd"}

Unter Windows sehen Sie nur den Benutzernamen, das Passwort wird im Anmeldeinformations-Manager (Systemsteuerung) gespeichert
Thorbjørn Ravn Andersen

Ich denke, ich werde die Überraschung verderben ... docker-credential-wincred.exe <store|get|erase|list|version>was bedeutet, dass Sie getIhr Passwort
KCD

Dieser Befehl cat sollte Linux-Pfadtrennzeichen verwenden: cat ~ / .docker / config.json. Für manche mag dies ein Trottel sein, aber andere Leser kopieren / fügen es einfach ein und probieren es aus und stellen nicht ohne weiteres fest, dass der Fehler "Keine solche Datei oder kein solches Verzeichnis" darauf zurückzuführen ist. :-)
Charlie Arehart

@charliearehart Sie unterschätzen meine Faulheit, ich habe den catAlias ​​in Powershell verwendet ... aktualisiert, um beide
einzuschließen

@ KCD, ah. :-) Danke fürs klarstellen.
Charlie Arehart

4

Gerade überprüft, heute sieht es so aus:

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

HINWEIS: Dies ist unter einem MacOS mit der neuesten Version von Docker CE, Docker-Anmeldeinformations-Helfer - beide mit Homebrew installiert.


3

Zumindest in "Docker für Windows" können Sie sehen, ob Sie über die Benutzeroberfläche beim Docker-Hub angemeldet sind. Klicken Sie einfach mit der rechten Maustaste auf das Docker-Symbol im Windows-Benachrichtigungsbereich: Docker angemeldet


1
Was ist mit den Docker-Versionen ohne die GUI? oder Nicht-Fenster?
Zameer Fouzan

1
Dann müssen Sie einen der Ansätze aus den anderen Antworten verwenden.
BaluJr.

2

Wenn Sie einen einfachen true/falseWert wünschen , können Sie Ihren docker.jsonan weiterleiten 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

1
Sie können jqeinen korrekten Exit-Code zurückgeben und müssen dann keine Zeichenfolgenvergleiche durchführen:is_logged_in() { jq -e --arg url ${ADDRESS} '.auths | has($url)' ~/.docker/config.json > /dev/null; }; if is_logged_in; then ...
Guss

Nett! Danke dir!
mcw


1

Unter Windows können Sie die Anmeldeberechtigungen (Auths) anhand der folgenden Datei überprüfen : [USER_HOME_DIR] .docker \ config.json

Beispiel: c: \ USERS \ YOUR_USERANME.docker \ config.json

Bei Windows-Anmeldeinformationen sieht es ungefähr so ​​aus

{
"auths": {
    "HOST_NAME_HERE": {},
    "https://index.docker.io/v1/": {}
},
"HttpHeaders": {
    "User-Agent": "Docker-Client/18.09.0 (windows)"
},
"credsStore": "wincred",
"stackOrchestrator": "swarm"
}

0

Wie von @Christian hervorgehoben, versuchen Sie am besten zuerst den Betrieb und melden Sie sich dann nur bei Bedarf an. Das Problem ist, dass "wenn nötig" nicht so offensichtlich ist, um robust zu machen. Ein Ansatz besteht darin, den stderr der Docker-Operation mit einigen bekannten Zeichenfolgen zu vergleichen (durch Ausprobieren). Beispielsweise,

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!
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.