Come ottenere un elenco di immagini sul registro docker v2


204

Sto usando il docker register v1 e sono interessato a migrare alla versione più recente, v2. Ma ho bisogno di un modo per ottenere un elenco di immagini presenti nel registro; ad esempio con il registro v1 posso eseguire una richiesta GET http://myregistry:5000/v1/search?e il risultato è:

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

Ma non riesco a trovare sulla documentazione ufficiale qualcosa di simile per ottenere un elenco di immagini nel registro. Qualcuno sa un modo per farlo sulla nuova versione v2?


Ancora non abbastanza. Sono necessarie le date della creazione dell'immagine e del push dell'immagine e, si spera, includi / elimini le versioni precedenti dei tag. Deve esserci anche una vera interfaccia web, giusto? Sto parlando con il nostro amministratore - abbiamo solo 2.0
Andrew Wolfe,

Risposte:


405

Per l'ultima versione (dal 31-07-2015) di Registry V2, è possibile ottenere questa immagine da DockerHub:

docker pull distribution/registry:master

Elenca tutti i repository (effettivamente immagini):

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

Elenca tutti i tag per un repository:

curl -X GET https://myregistry:5000/v2/ubuntu/tags/list
> {"name":"ubuntu","tags":["14.04"]}

3
Da dove ottieni il certificato?
dualità_

3
@dualità nel caso in cui il registro utilizzi un certificato autofirmato o un certificato firmato da una CA radice non attendibile, è necessario fornire il certificato per arricciarsi per stabilire una connessione sicura. Per stabilire una connessione non sicura è possibile aggiungere invece il flag "--insecure".
Jonatan

5
-k, --insecure (SSL)
Ilja

9
Il risultato predefinito mostra solo 100 immagini registrate, ma se è necessario mostrarne altre è possibile impaginare il risultato con questa query: http://<registry-url>/v2/_catalog?n=<count> con conteggio ad esempio 2000.
kikicarbonell

17
Se il registro è protetto da password, utilizzarecurl -u <user>:<pass> -X GET ...
nsantos

77

puoi cercare

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


4
... da più di recente vorrei solo aggiungere che è richiesto https anziché solo http
Nikola,

2
Non vedo tale necessità per il mio registro Docker installato di recente!
Enok82,

44

Ottieni cataloghi

Predefinito, il registro API restituisce 100 voci di catalogo, c'è il codice :

Quando arriccia l'API del registro:

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

equivale a :

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

Questo è un metodo di paginazione.

Quando la somma delle voci oltre 100, è possibile eseguire in due modi:

Primo : dare un numero maggiore

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

Sencond : analizza l'URL del linker successivo

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

Un elemento di collegamento contenuto nell'intestazione della risposta:

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

intestazione di risposta:

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

L'elemento link ha l'ultima voce di questa richiesta, quindi puoi richiedere la 'pagina' successiva:

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

Se l'intestazione della risposta contiene un elemento di collegamento , è possibile farlo in un ciclo .

Ottieni immagini

Quando ottieni il risultato del catalogo, è come segue:

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

puoi ottenere le immagini in ogni catalogo:

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

ritorna:

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


1
100 voci definite qui
litanhua

2
Questa dovrebbe essere la risposta accettata. È l'unica risposta che spiega come aggirare la temuta impaginazione. La risposta attualmente accettata (jonatan) mostra solo immagini che iniziano con "a".
user2394284,

e come otterresti l'elenco dei tag ceph/mds? in generale, per qualsiasi deposito definito con /- /v2/_catalog/ceph/mdt/tags/listnon funziona
tymik il


21

A questo scopo abbiamo scritto uno strumento CLI: docker-ls Consente di sfogliare un registro docker e supporta l'autenticazione tramite token o autenticazione di base.


21

Questo mi sta facendo impazzire, ma finalmente ho messo insieme tutti i pezzi. A partire dal 25/01/2015, ho confermato che è possibile elencare le immagini nel registro della finestra mobile V2 (esattamente come sopra menzionato da @jonatan).

Voterei la risposta, se avessi il rappresentante.

Espanderò invece la risposta. Dal momento che il registro V2 è realizzato pensando alla sicurezza, penso sia opportuno includere come configurarlo con un certificato autofirmato ed eseguire il contenitore con quel certificato in modo da poter effettuare una chiamata https con quel certificato:

Questo è lo script che uso effettivamente per avviare il registro:

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

Questo può essere ovvio per alcuni, ma mi confondo sempre con chiavi e certificati. Il file che deve essere referenziato per fare menzione della chiamata @jonaton sopra **, è domain.crt sopra elencato. (Da quando ho inserito domain.crt /root, ne ho creato una copia nella directory dell'utente dove è possibile accedervi.)

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

** Il comando sopra è stato modificato: -X GET in realtà non ha funzionato quando l'ho provato.

Nota: https://myregistry:5000(come sopra) deve corrispondere al dominio assegnato al certificato generato.



7

Ecco un piccolo liner (usa JQ) per stampare un elenco di Repos e tag associati.

Se non hai jqinstallato puoi usare: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

argh, ho appena scritto questo e poi ho trovato la tua: S ma manterrò la mia risposta perché mostra come gestire anche l'autent di base e spiega perché funziona. Inoltre filtra il risultato in un elenco di immagini piatte.
Craig Ringer,

Solo nel caso in cui jq non sia nella tua distro Linux, prendila stedolan.github.io/jq/download È un piccolo strumento molto utile.
ISQ

5

Ho dovuto fare lo stesso qui e i lavori sopra descritti, tranne per il fatto che dovevo fornire i dettagli di accesso in quanto si trattava di un repository docker locale.

È come sopra ma fornendo il nome utente / password nell'URL.

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

Torna come JSON non formattato.

L'ho passato attraverso il formatter di Python per facilitare la lettura umana, nel caso in cui desideri averlo in questo formato.

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

4

Utilizzando gli endpoint "/ v2 / _catalog" e "/ tags / list" non è possibile elencare realmente tutte le immagini. Se hai inserito alcune immagini diverse e le hai taggate "più recenti" non puoi davvero elencare le vecchie immagini! Puoi ancora estrarli se ti riferisci a loro usando digest "docker pull ubuntu @ sha256: ac13c5d2 ...". Quindi la risposta è: non c'è modo di elencare le immagini, puoi solo elencare i tag che non sono gli stessi


3

Se qualcuno arriva così lontano.

Prendendo ciò che gli altri hanno già detto sopra. Ecco una riga che inserisce la risposta in un file di testo formattato, json.

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

Questo sembra

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

Potrebbe essere necessario modificare `? N = xxxx 'in modo che corrisponda al numero di container che hai.

Il prossimo è un modo per rimuovere automaticamente i contenitori vecchi e inutilizzati.



2

Ho scritto uno strumento da riga di comando facile da usare per elencare le immagini in vari modi (come elencare tutte le immagini, elencare tutti i tag di quelle immagini, elencare tutti i livelli di quei tag).

Inoltre, consente di eliminare le immagini inutilizzate in vari modi, ad esempio eliminare solo i tag più vecchi di una singola immagine o da tutte le immagini, ecc. È utile quando si riempie il registro da un server CI e si desidera conservare solo le versioni più recenti / stabili.

È scritto in Python e non necessita di scaricare grandi immagini di registro personalizzate ingombranti.


2

Ecco un esempio che elenca tutti i tag di tutte le immagini nel registro. Gestisce anche un registro configurato per l'autenticazione HTTP di base.

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

Spiegazione:

  • estrarre username: password da .docker / config.json
  • effettuare una richiesta https al registro per elencare tutti i "repository"
  • filtra il risultato json in un elenco semplice di nomi di repository
  • per ciascun nome di repository:
  • invia una richiesta https al registro per elencare tutti i "tag" per quel "repository"
  • filtra il flusso di oggetti json dei risultati, stampando "repository": coppie "tag" per ogni tag trovato in ciascun repository

1

Questa discussione risale a molto tempo fa, gli strumenti più recenti che si dovrebbero considerare sono skopeoe crane.

skopeosupporta la firma e ha molte altre funzionalità, mentre craneè un po 'più minimalista e ho trovato più facile integrarmi con un semplice script di shell.


0

Poiché ogni registro viene eseguito come contenitore, l'ID contenitore ha un file di registro ID-json.log associato, questo file di registro contiene vars.name = [image] e vars.reference = [tag]. Uno script può essere utilizzato per estrapolare e stampare questi. Questo è forse un metodo per elencare le immagini inviate al registro V2-2.0.1.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.