Jak uzyskać listę obrazów w rejestrze dokera v2

203

Korzystam z rejestru dokera v1 i jestem zainteresowany migracją do nowszej wersji v2. Potrzebuję jednak sposobu, aby uzyskać listę obrazów obecnych w rejestrze; na przykład z rejestrem v1 mogę wykonać żądanie GET http://myregistry:5000/v1/search?i wynik jest następujący:

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

Ale nie mogę znaleźć w oficjalnej dokumentacji czegoś podobnego, aby uzyskać listę obrazów w rejestrze. Czy ktoś wie, jak to zrobić w nowej wersji v2?

kikicarbonell
źródło
Wciąż za mało. Potrzebuję dat utworzenia obrazu i wypchnięcia obrazu, i mam nadzieję, że dołączą / ukryją wcześniejsze wersje tagów. Musi też istnieć interfejs sieciowy, prawda? Rozmawiam z naszym administratorem - mamy tylko 2.0
Andrew Wolfe

Odpowiedzi:

404

W najnowszej (na dzień 31.07.2015) wersji rejestru V2 można uzyskać ten obraz z DockerHub:

docker pull distribution/registry:master

Wyświetl wszystkie repozytoria (efektywnie obrazy):

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

Wyświetl wszystkie tagi dla repozytorium:

curl -X GET https://myregistry:5000/v2/ubuntu/tags/list
> {"name":"ubuntu","tags":["14.04"]}
jonatan
źródło
3
Skąd bierzesz certyfikat?
duality_
3
@ dualność, jeśli rejestr używa certyfikatu z podpisem własnym lub certyfikatu podpisanego przez niezaufany główny urząd certyfikacji, musisz dostarczyć certyfikat, aby się zawinąć, aby ustanowić bezpieczne połączenie. Aby nawiązać niezabezpieczone połączenie, możesz zamiast tego dodać flagę „--insecure”.
jonatan
5
-k, --insecure (SSL)
Ilja
9
Domyślny wynik pokazuje tylko 100 zdjęć, ale jeśli chcesz pokazać więcej, możesz paginować wynik za pomocą tego zapytania: http://<registry-url>/v2/_catalog?n=<count>z liczbą na przykład 2000.
kikicarbonell
17
Jeśli rejestr jest chroniony hasłem, użyjcurl -u <user>:<pass> -X GET ...
nsantos
77

możesz szukać dalej

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

Abhishek Jaiswal
źródło
4
... od niedawna chciałbym dodać, że https jest wymagany zamiast tylko http
Nikola
2
Nie widzę takiej potrzeby w moim niedawno zainstalowanym rejestrze Docker!
Enok82,
43

Uzyskaj katalogi

Domyślnie interfejs API rejestru zwraca 100 pozycji katalogu, jest kod :

Po zwinięciu interfejsu API rejestru:

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

odpowiada to :

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

To jest metoda paginacji.

Gdy suma wpisów powyżej 100, możesz to zrobić na dwa sposoby:

Po pierwsze : podaj większą liczbę

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

Sencond : parsuj następny adres linku

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

Element odsyłacza zawarty w nagłówku odpowiedzi:

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

nagłówek odpowiedzi:

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

Element linku ma ostatni wpis tego żądania, a następnie możesz poprosić o następną „stronę”:

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

Jeśli nagłówek odpowiedzi zawiera element łącza , możesz to zrobić w pętli .

Uzyskaj obrazy

Gdy otrzymasz wynik z katalogu, wygląda to następująco:

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

obrazy można uzyskać w każdym katalogu:

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

zwroty:

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

litanhua
źródło
1
Zdefiniowano tutaj
litanhua
2
To powinna być zaakceptowana odpowiedź. To jedyna odpowiedź, która wyjaśnia, jak poradzić sobie z przerażającą paginacją. Aktualnie akceptowana odpowiedź (jonatan) pokazuje tylko obrazy zaczynające się od „a”.
user2394284
i skąd masz listę tagów ceph/mds? ogólnie dla każdego repozytorium zdefiniowanego za pomocą /- /v2/_catalog/ceph/mdt/tags/listnie działa
tymik
25

Najnowsza wersja rejestru Docker dostępna na stronie https://github.com/docker/distribution obsługuje API katalogu. (v2 / _catalog). Pozwala to na przeszukiwanie repozytoriów

W razie zainteresowania możesz wypróbować interfejs wiersza polecenia obrazu dokera, który zbudowałem, aby ułatwić korzystanie z funkcji wyszukiwania w nowej dystrybucji rejestru Docker ( https://github.com/vivekjuneja/docker_registry_cli )

ZephyrPLUSPLUS
źródło
21

W tym celu napisaliśmy narzędzie CLI: docker-ls. Umożliwia przeglądanie rejestru dokera i obsługuje uwierzytelnianie za pomocą tokena lub podstawowego uwierzytelniania.

Christian Speckner
źródło
21

Doprowadziło mnie to do szaleństwa, ale w końcu zebrałem wszystkie elementy. Na dzień 25.01.2015 potwierdziłem, że można wyświetlać obrazy w rejestrze dokera V2 (dokładnie tak, jak wspomniano powyżej w @jonatan).

Poparłbym tę odpowiedź, gdybym miał za to przedstawiciela.

Zamiast tego rozwinę odpowiedź. Ponieważ rejestr V2 jest tworzony z myślą o bezpieczeństwie, uważam, że należy uwzględnić sposób jego konfiguracji z certyfikatem z podpisem własnym i uruchomić kontener z tym certyfikatem , aby można było do niego wywołać https z tym certyfikatem:

Oto skrypt, którego faktycznie używam do uruchomienia rejestru:

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

Dla niektórych może to być oczywiste, ale zawsze mylę się z kluczami i certyfikatami. Plik, do którego należy odwołać się, aby wywołanie wspomniane powyżej @jonaton **, to domena.crt wymieniona powyżej. (Od kiedy wstawiłem domain.crt /root, zrobiłem kopię do katalogu użytkownika, gdzie można było uzyskać do niej dostęp).

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

** Powyższe polecenie zostało zmienione: -X GET faktycznie nie działało, kiedy go wypróbowałem.

Uwaga: https://myregistry:5000(jak wyżej) musi pasować do domeny podanej do wygenerowanego certyfikatu.

Cognitiaclaeves
źródło
7

Oto fajny mały linijka (używa JQ) do wydrukowania listy repozytoriów i powiązanych tagów.

Jeśli nie masz jqzainstalowanego, możesz użyć: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
źródło
argh, właśnie to napisałem, a potem znalazłem twoją: S, ale zachowam swoją odpowiedź, ponieważ pokazuje, jak obsługiwać uwierzytelnianie podstawowe i wyjaśnia, dlaczego to działa. Filtruje również wynik do płaskiej listy obrazów.
Craig Ringer
Na wypadek, gdyby jq nie było w twojej dystrybucji Linuksa, zdobądź to jej stedolan.github.io/jq/download To bardzo przydatne małe narzędzie.
ISQ
5

Musiałem zrobić to samo tutaj i powyższe prace, z wyjątkiem tego, że musiałem podać dane logowania, ponieważ było to lokalne repozytorium dokerów.

Jest tak jak powyżej, ale z podaniem nazwy użytkownika / hasła w adresie URL.

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

Wraca jako niesformatowany JSON.

Przepuściłem go przez formater Pythona, aby ułatwić czytanie, na wypadek, gdybyś chciał go mieć w tym formacie.

curl -k -X GET https://yourusername:yourpassword@theregistryURL/v2/_catalog | python -m json.tool
Chai
źródło
4

Używając punktów końcowych „/ v2 / _catalog” i „/ tags / list”, nie można tak naprawdę wyświetlić wszystkich obrazów. Jeśli wybrałeś kilka różnych zdjęć i oznaczyłeś je jako „najnowsze”, tak naprawdę nie możesz wymienić starych zdjęć! Nadal możesz je wyciągnąć, jeśli odniesiesz się do nich, używając skrótu „docker pull ubuntu @ sha256: ac13c5d2 ...”. Tak więc odpowiedź brzmi - nie ma sposobu, aby wyświetlić listę obrazów, można jedynie wymienić tagi, które nie są takie same

użytkownik1616472
źródło
3

Jeśli niektórzy dotrą tak daleko.

Biorąc to, co inni już powiedzieli powyżej. Oto jedno-linijka, która umieszcza odpowiedź w formacie tekstowym, json.

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

To wygląda jak

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

Być może trzeba zmienić `? N = xxxx ', aby dopasować liczbę posiadanych pojemników.

Dalej to sposób automatycznego usuwania starych i nieużywanych pojemników.

nelaaro
źródło
2

Napisałem łatwe w użyciu narzędzie wiersza poleceń do wyświetlania zdjęć na różne sposoby (np. Wyświetl listę wszystkich zdjęć, listę wszystkich tagów tych obrazów, listę wszystkich warstw tych tagów).

Umożliwia także usuwanie nieużywanych obrazów na różne sposoby, takie jak usuwanie tylko starszych znaczników jednego obrazu lub wszystkich obrazów itp. Jest to wygodne, gdy wypełniasz rejestr z serwera CI i chcesz zachować tylko najnowsze / stabilne wersje.

Jest napisany w pythonie i nie wymaga pobierania dużych, niestandardowych obrazów rejestru.

anoksis
źródło
2

Oto przykład z listą wszystkich tagów wszystkich obrazów w rejestrze. Obsługuje również rejestr skonfigurowany dla uwierzytelniania HTTP Basic.

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"][]'

Wyjaśnienie:

  • wypakuj nazwę użytkownika: hasło z .docker / config.json
  • wysłać do rejestru żądanie https, aby wyświetlić wszystkie „repozytoria”
  • odfiltruj wynik JSON do płaskiej listy nazw repozytoriów
  • dla każdej nazwy repozytorium:
  • wysłać do rejestru żądanie https, aby wyświetlić wszystkie „tagi” dla tego „repozytorium”
  • filtruj strumień wynikowych obiektów json, wypisując pary „repozytorium”: „tag” dla każdego tagu znalezionego w każdym repozytorium
Craig Ringer
źródło
1

Wątki te pochodzą z dawnych czasów, a najczęściej wymienianymi narzędziami, które należy wziąć pod uwagę, są skopeoi crane.

skopeoobsługuje podpisywanie i ma wiele innych funkcji, a jednocześnie cranejest nieco bardziej minimalistyczny i łatwiej mi było go zintegrować z prostym skryptem powłoki.

programista błędów
źródło
0

Ponieważ każdy rejestr działa jako kontener, identyfikator kontenera ma powiązany plik dziennika ID-json.log, ten plik dziennika zawiera vars.name = [image] i vars.reference = [tag]. Do ekstrapolacji i wydrukowania można użyć skryptu. Jest to być może jedna z metod wyświetlania obrazów przesłanych do rejestru V2-2.0.1.

Phil Pinkerton
źródło