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?


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"]}

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


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"]}


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


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.


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é.



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

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

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


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.



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.


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

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.


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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.