web-dev-qa-db-fra.com

Comment obtenir une liste d'images sur le registre de docker v2

J'utilise Docker Registry v1 et je suis intéressé par la migration vers la nouvelle version, v2. Mais il me faut un moyen d’obtenir une liste des images présentes dans le registre; Par exemple, avec le registre v1, je peux exécuter une requête GET sur http://myregistry:5000/v1/search? et le résultat est le suivant:

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

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

147
kikicarbonell

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

docker pull distribution/registry:master

Lister tous les dépôts (images effectivement):

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

Répertoriez toutes les balises d'un référentiel:

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

vous pouvez rechercher sur 

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

56
Abhishek Jaiswal

Obtenir des catalogues

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

Lorsque vous curlez l’API de registre:

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

il est équivalent avec:

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

Ceci est une méthode de pagination.

Lorsque la somme des entrées est supérieure à 100, vous pouvez le faire de deux manières:

First: donne 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 la 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 la réponse contient l'élément link, vous pouvez le faire dans un loop.

Obtenir des images

Lorsque vous obtenez le résultat du catalogue, il se présente comme suit:

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

vous pouvez obtenir les images dans chaque catalogue:

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

résultats:

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

29
litanhua

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

Si cela vous intéresse, vous pouvez essayer la CLI que j'ai construite avec Docker Image Registry pour simplifier l'utilisation des fonctions de recherche dans la nouvelle distribution de Docker Registry ( https://github.com/vivekjuneja/docker_registry_cli ).

23
ZephyrPLUSPLUS

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

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

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

C’est le script que j’utilise réellement 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 sembler évident à certains, mais je me mêle toujours de clés et de certs. Le fichier qui doit être référencé pour que l'appel @jonaton mentionne ci-dessus ** est le domaine.crt répertorié ci-dessus. (Depuis que j'ai mis domain.crt dans /root, j'ai fait une copie dans le répertoire de l'utilisateur où il pourrait être consulté.) 

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

** La commande ci-dessus a été modifiée: -X GET n'a pas fonctionné lorsque j'ai essayé.

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

19
Cognitiaclaeves

Veuillez consulter la réponse de @ jonathan ci-dessous , ou la documentation de l'API de registre ici: https://docs.docker.com/registry/spec/api/

Si vous recherchez "listing", vous verrez que le support a été ajouté dans la version e.

14
Andy

Nous avons conçu un outil de ligne de commande à cette fin: docker-ls Il vous permet de parcourir un registre de dockers et prend en charge l’authentification via un jeton ou une autorisation de base.

12

Installer le registre: 2.1.1 ou une version ultérieure (vous pouvez vérifier le dernier, ici ) et utiliser GET/v2/_catalog pour obtenir la liste. 

https://github.com/docker/distribution/blob/master/docs/spec/api.md#listing-repositories

Liste toutes les images par exemple de script shell: https://Gist.github.com/OndrejP/a2386d08e5308b0776c0

9
Ondrej Prochazka

Avec 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 tirer si vous vous y référez en utilisant digest "docker pull ubuntu @ sha256: ac13c5d2 ...". La réponse est donc: il n'y a aucun moyen de lister les images, vous pouvez seulement lister les tags qui ne sont pas les mêmes

2
user1616472

Si certains vont aussi loin. 

Prenant ce que d'autres ont déjà dit ci-dessus. Voici un one-liner qui place la réponse dans un fichier texte au 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 paramètre «? N = xxxx» pour qu'il corresponde à votre nombre de conteneurs.

Suivant est un moyen de supprimer automatiquement les conteneurs anciens et inutilisés. 

2
nelaaro

La fonctionnalité de registre v2 de Docker Search n'est actuellement pas prise en charge au moment de la rédaction de cet article. Voir discussion depuis février 2015: "propose une fonctionnalité de recherche dans le 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 privé enregistrement.

1
Bradley Allen

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

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 sous forme de JSON non formaté.

Je l'ai fait passer par le formateur Python pour faciliter la lecture humaine, au cas où vous souhaiteriez l'avoir dans ce format.

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

J'ai écrit un outil de 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 différentes manières, par exemple en supprimant uniquement les anciennes balises d’une seule image ou de toutes les images, etc. Ceci est pratique lorsque vous remplissez votre base de registre à partir d’un serveur CI et souhaitez conserver uniquement les versions les plus récentes/stables.

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

1
anoxis

Voici un joli petit manchon (utilise JQ) pour imprimer une liste de dépôts et d’étiquettes associées.

Si vous n'avez pas installé jq, 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
1
Jeef

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

Explication:

  • extraire le nom d'utilisateur: mot de passe de .docker/config.json
  • faire une demande https au registre pour lister tous les "référentiels"
  • filtrer le résultat JSON en une liste plate de noms de référentiels
  • pour chaque nom de référentiel:
  • faire une demande https au registre pour lister tous les "tags" pour ce "référentiel"
  • filtrer le flux des objets json résultants en imprimant les paires "tag" pour chaque tag trouvé dans chaque référentiel
0
Craig Ringer

Chaque registre étant exécuté en tant que conteneur, l'ID de conteneur a un fichier journal associé ID-json.log, ce fichier journal contient vars.name = [image] et vars.reference = [tag]. Un script peut être utilisé pour les extrapoler et les imprimer. C'est peut-être une méthode pour lister les images envoyées au registre V2-2.0.1.

0
Phil Pinkerton