So erhalten Sie eine Liste der Bilder in der Docker-Registrierung v2

203

Ich verwende die Docker-Registrierung v1 und bin an einer Migration auf die neuere Version v2 interessiert. Aber ich brauche eine Möglichkeit, um eine Liste der Bilder zu erhalten, die in der Registrierung vorhanden sind. Zum Beispiel kann ich mit Registry v1 eine GET-Anfrage an ausführen http://myregistry:5000/v1/search?und das Ergebnis ist:

{
  "num_results": 2,
  "query": "",
  "results": [
    {
      "description": "",
      "name": "deis/router"
    },
    {
      "description": "",
      "name": "deis/database"
    }
  ]
}

Aber ich kann in der offiziellen Dokumentation nichts Ähnliches finden, um eine Liste der Bilder in der Registrierung zu erhalten. Kennt jemand einen Weg, dies in der neuen Version v2 zu tun?

Kikicarbonell
quelle
Immer noch nicht genug. Benötigen Sie die Daten für die Image-Erstellung und den Image-Push und hoffentlich / unterdrücken Sie frühere Tag-Versionen. Es muss auch ein echtes Webinterface geben, oder? Ich spreche mit unserem Administrator - wir haben nur 2.0
Andrew Wolfe

Antworten:

404

Für die neueste Version (Stand: 31.07.2015) von Registry V2 erhalten Sie dieses Bild von DockerHub:

docker pull distribution/registry:master

Listen Sie alle Repositorys (effektiv Bilder) auf:

curl -X GET https://myregistry:5000/v2/_catalog
> {"repositories":["redis","ubuntu"]}

Listen Sie alle Tags für ein Repository auf:

curl -X GET https://myregistry:5000/v2/ubuntu/tags/list
> {"name":"ubuntu","tags":["14.04"]}
Jonatan
quelle
3
Woher bekommen Sie das Zertifikat?
Dualität_
3
@duality Wenn Ihre Registrierung entweder ein selbstsigniertes Zertifikat oder ein von einer nicht vertrauenswürdigen Stammzertifizierungsstelle signiertes Zertifikat verwendet, müssen Sie das Zertifikat zum Einrollen bereitstellen, um eine sichere Verbindung herzustellen. Um eine unsichere Verbindung herzustellen, können Sie stattdessen das Flag '--insecure' hinzufügen.
Jonatan
5
-k, - unsicher (SSL)
Ilja
9
Das Standardergebnis zeigt nur 100 Bilder an. Wenn Sie jedoch mehr http://<registry-url>/v2/_catalog?n=<count>
anzeigen
17
Wenn die Registrierung durch ein Passwort geschützt ist, verwenden Siecurl -u <user>:<pass> -X GET ...
nsantos
77

Sie können weiter suchen

http: // <ip/hostname>: <port>/ v2 / _catalog

Abhishek Jaiswal
quelle
4
... seit kurzem möchte ich nur hinzufügen, dass https anstelle von nur http erforderlich ist
Nikola
2
Ich sehe keine solche Notwendigkeit für meine kürzlich installierte Docker-Registrierung!
Enok82
42

Kataloge abrufen

Standardmäßig gibt die Registrierungs-API 100 Katalogeinträge zurück Code :

Wenn Sie die Registrierungs-API einrollen:

curl --cacert domain.crt https://your.registry:5000/v2/_catalog

es entspricht :

curl --cacert domain.crt https://your.registry:5000/v2/_catalog?n=100

Dies ist eine Paginierungsmethode.

Wenn die Summe der Einträge über 100 liegt, haben Sie zwei Möglichkeiten:

Erstens : Geben Sie eine größere Zahl an

curl --cacert domain.crt https://your.registry:5000/v2/_catalog?n=2000

Sencond : Analysiere die nächste Linker-URL

curl --cacert domain.crt https://your.registry:5000/v2/_catalog

Ein im Antwortheader enthaltenes Verknüpfungselement:

curl --cacert domain.crt https://your.registry:5000/v2/_catalog

Antwortheader:

Link: </v2/_catalog?last=pro-octopus-ws&n=100>; rel="next"

Das Link-Element hat den letzten Eintrag dieser Anfrage, dann können Sie die nächste 'Seite' anfordern:

curl --cacert domain.crt https://your.registry:5000/v2/_catalog?last=pro-octopus-ws

Wenn die Antwort - Header enthält Link - Element, können Sie es in einer do - Schleife .

Holen Sie sich Bilder

Wenn Sie das Ergebnis des Katalogs erhalten, sieht es wie folgt aus:

{ "repositories": [ "busybox", "ceph/mds" ] }

Sie können die Bilder in jedem Katalog erhalten:

curl --cacert domain.crt https://your.registry:5000/v2/busybox/tags/list

kehrt zurück:

{"name":"busybox","tags":["latest"]}

Litanhua
quelle
1
100 Einträge hier
Litanhua
2
Dies sollte die akzeptierte Antwort sein. Es ist die einzige Antwort, die erklärt, wie Sie die gefürchtete Paginierung umgehen. Die aktuell akzeptierte Antwort (Jonatan) zeigt nur Bilder, die mit "a" beginnen.
user2394284
und wie würden Sie Tags Liste für bekommen ceph/mds? im Allgemeinen für jedes Repository definiert mit /- /v2/_catalog/ceph/mdt/tags/listfunktioniert nicht
tymik
25

Die neueste Version der Docker-Registrierung, die unter https://github.com/docker/distribution verfügbar ist, unterstützt die Katalog-API. (v2 / _katalog). Dies ermöglicht die Suche nach Repositorys

Bei Interesse können Sie die von mir erstellte Docker-Image-Registrierungs-CLI ausprobieren, um die Verwendung der Suchfunktionen in der neuen Docker-Registrierungsdistribution ( https://github.com/vivekjuneja/docker_registry_cli ) zu vereinfachen.

ZephyrPLUSPLUS
quelle
21

Zu diesem Zweck haben wir ein CLI-Tool geschrieben: docker-ls Es ermöglicht Ihnen das Durchsuchen einer Docker-Registrierung und unterstützt die Authentifizierung über Token oder Basisauthentifizierung.

Christian Speckner
quelle
21

Das hat mich verrückt gemacht, aber ich habe endlich alle Teile zusammengefügt. Ab dem 25.01.2015 habe ich bestätigt, dass es möglich ist, die Bilder in der Docker V2-Registrierung aufzulisten (genau wie oben erwähnt @jonatan).

Ich würde diese Antwort abstimmen, wenn ich den Repräsentanten dafür hätte.

Stattdessen werde ich die Antwort erweitern. Da die Registrierung V2 aus Sicherheitsgründen erstellt wird, ist es meiner Meinung nach angebracht, anzugeben , wie sie mit einem selbstsignierten Zertifikat eingerichtet und der Container mit diesem Zertifikat ausgeführt wird ein https-Aufruf an sie erfolgen kann:

Dies ist das Skript, mit dem ich die Registrierung tatsächlich starte:

sudo docker stop registry
sudo docker rm -v registry
sudo docker run -d \
  -p 5001:5001 \
  -p 5000:5000 \
  --restart=always \
  --name registry \
  -v /data/registry:/var/lib/registry \
  -v /root/certs:/certs \
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
  -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \ 
  -e REGISTRY_HTTP_DEBUG_ADDR=':5001' \
  registry:2.2.1

Dies mag für manche offensichtlich sein, aber ich bin immer mit Schlüsseln und Zertifikaten verwechselt. Die Datei, auf die verwiesen werden muss, damit der Aufruf @jonaton oben erwähnt wird **, ist die oben aufgeführte domain.crt. (Seit ich domain.crt eingegeben habe /root, habe ich eine Kopie in das Benutzerverzeichnis erstellt, auf das zugegriffen werden kann.)

curl --cacert ~/domain.crt https://myregistry:5000/v2/_catalog
> {"repositories":["redis","ubuntu"]}

** Der obige Befehl wurde geändert: -X GET hat nicht wirklich funktioniert, als ich es ausprobiert habe.

Hinweis: https://myregistry:5000(wie oben) muss mit der Domäne übereinstimmen, die dem generierten Zertifikat zugewiesen wurde.

Cognitiaclaeves
quelle
7

Hier ist ein netter kleiner Liner (verwendet JQ), um eine Liste von Repos und zugehörigen Tags auszudrucken.

Wenn Sie nicht jqinstalliert haben, können Sie verwenden:brew install jq

# This is my URL but you can use any
REPO_URL=10.230.47.94:443

curl -k -s -X GET https://$REPO_URL/v2/_catalog \
 | jq '.repositories[]' \
 | sort \
 | xargs -I _ curl -s -k -X GET https://$REPO_URL/v2/_/tags/list
Jeef
quelle
argh, ich habe das gerade geschrieben und dann deins gefunden: S, aber ich werde meine Antwort behalten, weil es zeigt, wie man auch mit Basic Auth umgeht, und es erklärt, warum es funktioniert. Filtert das Ergebnis auch in eine flache Bildliste.
Craig Ringer
Nur für den Fall, dass jq nicht in Ihrer Linux-Distribution enthalten ist, besorgen Sie es sich. Stedolan.github.io/jq/download Es ist ein sehr nützliches kleines Tool.
ISQ
5

Ich musste hier dasselbe tun und die oben genannten Arbeiten, außer dass ich Anmeldedaten angeben musste, da es sich um ein lokales Docker-Repository handelte.

Es ist wie oben beschrieben, jedoch mit Angabe des Benutzernamens / Passworts in der URL.

curl -k -X GET https://yourusername:yourpassword@theregistryURL/v2/_catalog

Es kommt als unformatierter JSON zurück.

Ich habe es zur Erleichterung des menschlichen Lesens durch den Python-Formatierer geleitet, falls Sie es in diesem Format haben möchten.

curl -k -X GET https://yourusername:yourpassword@theregistryURL/v2/_catalog | python -m json.tool
Chai
quelle
4

Mit den Endpunkten "/ v2 / _catalog" und "/ tags / list" können Sie nicht wirklich alle Bilder auflisten. Wenn Sie ein paar verschiedene Bilder gepusht und mit "Neueste" markiert haben, können Sie die alten Bilder nicht wirklich auflisten! Sie können sie weiterhin abrufen, wenn Sie mit dem Digest "docker pull ubuntu @ sha256: ac13c5d2 ..." auf sie verweisen. Die Antwort lautet also: Es gibt keine Möglichkeit, Bilder aufzulisten. Sie können nur Tags auflisten, die nicht identisch sind

user1616472
quelle
3

Wenn einige so weit kommen.

Nehmen Sie, was andere oben bereits gesagt haben. Hier ist ein Einzeiler, der die Antwort in eine mit json formatierte Textdatei legt.

curl "http://mydocker.registry.domain/v2/_catalog?n=2000" | jq . - > /tmp/registry.lst

Das sieht so aus

{
  "repositories": [
    "somerepo/somecontiner",
    "somerepo_other/someothercontiner",
 ...
  ]
}

Möglicherweise müssen Sie `? N = xxxx 'ändern, um der Anzahl der Container zu entsprechen, über die Sie verfügen.

Als nächstes können Sie alte und nicht verwendete Container automatisch entfernen.

Nelaaro
quelle
2

Die Funktionalität von Docker Search Registry v2 wird derzeit zum Zeitpunkt dieses Schreibens nicht unterstützt. Siehe Diskussion seit Februar 2015: "Registrierungssuchfunktion # 206 vorschlagen" https://github.com/docker/distribution/issues/206

Ich habe ein Skript geschrieben, das Sie finden können: https://github.com/BradleyA/Search-docker-registry-v2-script.1.0 Es ist nicht schön, aber es erhält die benötigten Informationen aus der privaten Registrierung.

Bradley Allen
quelle
2

Ich habe ein benutzerfreundliches Kommandozeilen-Tool geschrieben mit dem Bilder auf verschiedene Arten aufgelistet werden können (z. B. alle Bilder auflisten, alle Tags dieser Bilder auflisten, alle Ebenen dieser Tags auflisten).

Sie können auch nicht verwendete Bilder auf verschiedene Arten löschen, z. B. nur ältere Tags eines einzelnen Bildes oder aus allen Bildern usw. löschen. Dies ist praktisch, wenn Sie Ihre Registrierung von einem CI-Server aus füllen und nur die neuesten / stabilen Versionen behalten möchten.

Es ist in Python geschrieben und erfordert nicht das Herunterladen umfangreicher großer benutzerdefinierter Registrierungsbilder.

Anoxis
quelle
2

Hier ist ein Beispiel, in dem alle Tags aller Bilder in der Registrierung aufgelistet sind. Es verarbeitet auch eine Registrierung, die für die HTTP Basic-Authentifizierung konfiguriert ist.

THE_REGISTRY=localhost:5000

# Get username:password from docker configuration. You could
# inject these some other way instead if you wanted.
CREDS=$(jq -r ".[\"auths\"][\"$THE_REGISTRY\"][\"auth\"]" .docker/config.json | base64 -d)

curl -s --user $CREDS https://$THE_REGISTRY/v2/_catalog | \
    jq -r '.["repositories"][]' | \
    xargs -I @REPO@ curl -s --user $CREDS https://$THE_REGISTRY/v2/@REPO@/tags/list | \
    jq -M '.["name"] + ":" + .["tags"][]'

Erläuterung:

  • Benutzername: Passwort aus .docker / config.json extrahieren
  • Stellen Sie eine https-Anfrage an die Registrierung, um alle "Repositorys" aufzulisten.
  • Filtern Sie das JSON-Ergebnis in eine flache Liste von Repository-Namen
  • für jeden Repository-Namen:
  • Stellen Sie eine https-Anfrage an die Registrierung, um alle "Tags" für dieses "Repository" aufzulisten.
  • Filtern Sie den Stream der Ergebnis-JSON-Objekte und drucken Sie "Repository": "Tag" -Paare für jedes in jedem Repository gefundene Tag
Craig Ringer
quelle
1

Dieser Thread stammt aus einer langen Zeit, die aktuellsten Tools, die man berücksichtigen sollte, sind skopeound crane.

skopeounterstützt das Signieren und hat viele andere Funktionen, craneist jedoch etwas minimalistischer und ich fand es einfacher, sie in ein einfaches Shell-Skript zu integrieren.

Fehlerentwickler
quelle
0

Da jede Registrierung als Container ausgeführt wird, ist der Container-ID eine Protokolldatei ID-json.log zugeordnet. Diese Protokolldatei enthält die Variablen vars.name = [image] und vars.reference = [tag]. Ein Skript kann verwendet werden, um diese zu extrapolieren und zu drucken. Dies ist möglicherweise eine Methode zum Auflisten von Bildern, die in die Registrierung V2-2.0.1 verschoben wurden.

Phil Pinkerton
quelle