Comment obtenir une liste d'images sur le Docker Registry v2

204

J'utilise Docker Registry v1 et je souhaite migrer vers la nouvelle version, v2. Mais j'ai besoin d'un moyen d'obtenir une liste d'images présentes sur le registre; par exemple avec le registre v1, je peux exécuter une requête GET http://myregistry:5000/v1/search?et le résultat est:

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

Mais je ne peux pas trouver sur la documentation officielle quelque chose de similaire pour obtenir une liste d'images dans le registre. Quelqu'un connaît un moyen de le faire sur la nouvelle version v2?

kikicarbonell
la source
Ce n'est toujours pas suffisant. Besoin des dates de création d'image et de transmission d'image, et espérons-le inclure / supprimer les versions précédentes des balises. Il doit aussi y avoir une véritable interface Web, non? Je parle à notre administrateur - nous n'avons que 2.0
Andrew Wolfe

Réponses:

405

Pour la dernière version (à partir du 31/07/2015) de Registry V2, vous pouvez obtenir cette image à partir de DockerHub:

docker pull distribution/registry:master

Liste de tous les référentiels (en fait des images):

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

Liste toutes les balises d'un référentiel:

curl -X GET https://myregistry:5000/v2/ubuntu/tags/list
> {"name":"ubuntu","tags":["14.04"]}
Jonatan
la source
3
D'où obtenez-vous le certificat?
duality_
3
@duality dans le cas où votre registre utilise un certificat auto-signé ou un certificat signé par une autorité de certification racine non approuvée, vous devez fournir le certificat à curl pour établir une connexion sécurisée. Pour établir une connexion non sécurisée, vous pouvez ajouter le drapeau '--insecure' à la place.
jonatan
5
-k, --insecure (SSL)
Ilja
9
Le résultat par défaut ne montre qu'un enregistrement de 100 images, mais si vous avez besoin d'en montrer plus, vous pouvez paginer le résultat avec cette requête: http://<registry-url>/v2/_catalog?n=<count>avec count par exemple 2000.
kikicarbonell
17
Si le registre est protégé par mot de passe, utilisezcurl -u <user>:<pass> -X GET ...
nsantos
77

vous pouvez rechercher sur

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

Abhishek Jaiswal
la source
4
... depuis plus récemment, je voudrais simplement ajouter que https est requis au lieu de simplement http
Nikola
2
Je ne vois pas un tel besoin pour mon Docker Registry récemment installé!
Enok82
44

Obtenir des catalogues

Par défaut, l'API de registre retourne 100 entrées de catalogue, il y a le code :

Lorsque vous courbez l'API du Registre:

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

il équivaut à:

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

Il s'agit d'un méthond de pagination.

Lorsque la somme des entrées dépasse 100, vous pouvez procéder de deux manières:

Premièrement : donner un plus grand nombre

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

Sencond : analyser la prochaine URL de l'éditeur de liens

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

Un élément de lien contenu dans l'en-tête de réponse:

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

en-tête de réponse:

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

L'élément de lien a la dernière entrée de cette demande, alors vous pouvez demander la «page» suivante:

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

Si l'en-tête de réponse contient un élément de lien , vous pouvez le faire en boucle .

Obtenez des images

Lorsque vous obtenez le résultat du catalogue, il ressemble à ceci:

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

vous pouvez obtenir les images dans chaque catalogue:

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

Retour:

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

litanhua
la source
1
100 entrées définies ici
litanhua
2
Cela devrait être la réponse acceptée. C'est la seule réponse qui explique comment contourner la redoutable pagination. La réponse actuellement acceptée (jonatan) ne montre que les images commençant par "a".
user2394284
et comment obtenir la liste des tags ceph/mds? en général, pour tout référentiel défini avec /- /v2/_catalog/ceph/mdt/tags/listne fonctionne pas
tymik
25

La dernière version de Docker Registry disponible sur https://github.com/docker/distribution prend en charge l'API de catalogue. (v2 / _catalog). Cela permet de rechercher des référentiels

Si vous êtes intéressé, vous pouvez essayer l'interface CLI de registre d'images Docker que j'ai construite pour faciliter l'utilisation des fonctionnalités de recherche dans la nouvelle distribution Docker Registry ( https://github.com/vivekjuneja/docker_registry_cli )

ZephyrPLUSPLUS
la source
21

Nous avons écrit un outil CLI à cet effet: docker-ls Il vous permet de parcourir un registre de docker et prend en charge l'authentification via un jeton ou une authentification de base.

Christian Speckner
la source
21

Cela m'a rendu fou, mais j'ai finalement rassemblé toutes les pièces. Depuis le 25/01/2015, j'ai confirmé qu'il était possible de lister les images dans le registre docker V2 (exactement comme mentionné @jonatan ci-dessus.)

Je voterais pour cette réponse, si j'avais le représentant.

Au lieu de cela, je vais développer la réponse. Étant donné que le registre V2 est conçu pour la sécurité, je pense qu'il est approprié d'inclure la façon de le configurer avec un certificat auto-signé et d' exécuter le conteneur avec ce certificat afin qu'un appel https puisse lui être effectué avec ce certificat:

Voici le script que j'utilise pour démarrer le registre:

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

Cela peut être évident pour certains, mais je me mélange toujours avec des clés et des certificats. Le fichier qui doit être référencé pour faire l'appel @jonaton mentionne ci-dessus **, est le domain.crt répertorié ci-dessus. (Depuis que j'ai mis domain.crt dedans /root, j'ai fait une copie dans le répertoire utilisateur où il était accessible.)

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

** La commande ci-dessus a été modifiée: -X GET ne fonctionnait pas vraiment quand je l'ai essayé.

Remarque: https://myregistry:5000 (comme ci-dessus) doit correspondre au domaine donné au certificat généré.

Cognitiaclaeves
la source
7

Voici un joli petit liner (utilise JQ) pour imprimer une liste des Repos et des tags associés.

Si vous ne l'avez pas jqinstallé, vous pouvez utiliser: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
la source
argh, je viens d'écrire ceci puis j'ai trouvé le vôtre: S mais je vais garder ma réponse car elle montre comment gérer l'authentification de base aussi, et elle explique pourquoi cela fonctionne. Filtre également le résultat dans une liste d'images plates.
Craig Ringer
Juste au cas où jq ne serait pas dans votre distribution Linux, récupérez-la stedolan.github.io/jq/download C'est un petit outil très utile.
ISQ
5

J'ai dû faire la même chose ici et les travaux ci-dessus, sauf que je devais fournir des informations de connexion car il s'agissait d'un référentiel de docker local.

C'est comme ci-dessus mais en fournissant le nom d'utilisateur / mot de passe dans l'URL.

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

Il revient en tant que JSON non formaté.

Je l'ai passé à travers le formateur python pour faciliter la lecture humaine, au cas où vous voudriez l'avoir dans ce format.

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

En utilisant les points de terminaison "/ v2 / _catalog" et "/ tags / list", vous ne pouvez pas vraiment lister toutes les images. Si vous avez poussé quelques images différentes et les avez étiquetées "dernières", vous ne pouvez pas vraiment lister les anciennes images! Vous pouvez toujours les extraire si vous vous y référez en utilisant le résumé "docker pull ubuntu @ sha256: ac13c5d2 ...". Donc, la réponse est - il n'y a aucun moyen de lister les images, vous ne pouvez lister que les tags qui ne sont pas les mêmes

user1616472
la source
3

Si certains arrivent jusque-là.

Prenant ce que d'autres ont déjà dit ci-dessus. Voici un one-liner qui met la réponse dans un fichier texte formaté, json.

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

Cela ressemble à

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

Vous devrez peut-être modifier le `? N = xxxx 'pour qu'il corresponde au nombre de conteneurs dont vous disposez.

Ensuite, vous pouvez supprimer automatiquement les conteneurs anciens et inutilisés.

nelaaro
la source
2

La fonctionnalité Docker Search Registry v2 n'est actuellement pas prise en charge au moment d'écrire ces lignes. Voir la discussion depuis février 2015: «proposer la fonctionnalité de recherche de registre # 206» https://github.com/docker/distribution/issues/206

J'ai écrit un script que vous pouvez trouver: https://github.com/BradleyA/Search-docker-registry-v2-script.1.0 Ce n'est pas joli mais il obtient les informations nécessaires du registre privé.

Bradley Allen
la source
2

J'ai écrit un outil en ligne de commande facile à utiliser pour lister les images de différentes manières (comme lister toutes les images, lister toutes les balises de ces images, lister toutes les couches de ces balises).

Il vous permet également de supprimer des images inutilisées de diverses manières, comme supprimer uniquement les anciennes balises d'une seule image ou de toutes les images, etc.

Il est écrit en python et n'a pas besoin de vous pour télécharger de grosses images de registre personnalisées volumineuses.

anoxis
la source
2

Voici un exemple qui répertorie toutes les balises de toutes les images du registre. Il gère également un registre configuré pour l'authentification HTTP de 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"][]'

Explication:

  • extraire le nom d'utilisateur: mot de passe de .docker / config.json
  • faire une requête https au registre pour lister tous les "référentiels"
  • filtrer le résultat json sur une liste plate de noms de référentiel
  • pour chaque nom de référentiel:
  • faire une requête https au registre pour lister toutes les "balises" pour ce "référentiel"
  • filtrer le flux des objets json résultants, en imprimant des paires "référentiel": "balise" pour chaque balise trouvée dans chaque référentiel
Craig Ringer
la source
1

Ces discussions remontent à longtemps, les outils les plus récents que l'on devrait considérer sont skopeoet crane.

skopeoprend en charge la signature et possède de nombreuses autres fonctionnalités, tout en craneétant un peu plus minimaliste et j'ai trouvé plus facile à intégrer dans un script shell simple.

errordeveloper
la source
0

Étant donné que chaque registre s'exécute en tant que conteneur, l'ID du conteneur a un fichier journal associé ID-json.log, ce fichier journal contient les vars.name = [image] et vars.reference = [tag]. Un script peut être utilisé pour extrapoler et imprimer ces derniers. Il s'agit peut-être d'une méthode pour répertorier les images transmises au registre V2-2.0.1.

Phil Pinkerton
la source