Recherche des calques et des tailles de calque pour chaque image Docker

108

À des fins de recherche, j'essaie d'explorer le registre Docker public ( https://registry.hub.docker.com/ ) et de savoir 1) combien de couches une image moyenne possède et 2) les tailles de ces couches pour obtenir un idée de la distribution.

Cependant, j'ai étudié l'API et les bibliothèques publiques ainsi que les détails sur le github mais je ne trouve aucune méthode pour:

  • récupérer tous les référentiels / images publics (même si ce sont des milliers, j'ai encore besoin d'une liste de départ pour parcourir)
  • trouver toutes les couches d'une image
  • trouver la taille d'un calque (donc pas une image mais pour le calque individuel).

Quelqu'un peut-il m'aider à trouver un moyen de récupérer ces informations?

Je vous remercie!

EDIT: est-ce que quelqu'un est capable de vérifier que la recherche de '*' dans le registre Docker renvoie tous les référentiels et pas n'importe quoi qui mentionne '*' n'importe où? https://registry.hub.docker.com/search?q=*

user134589
la source
7
>>> trouvez toutes les couches d'une image, si vous n'utilisez pas l'API, vous pouvez faire un docker history myimageet vous verrez la taille de chaque couche. Plus généralement, sur une image, vous pouvez faire docker history myimage | awk 'NR>1 {print $1}' | xargs docker inspect --format '{{ ((index .ContainerConfig.Cmd ) 0) }}'pour voir quelles commandes ont été émises pour créer l'image
user2915097
C'est déjà une aide précieuse pour l'étape 2, bien que cela m'oblige à télécharger chaque image via Docker sur ma machine locale. Je suppose que c'est une option, mais seulement si je trouve un moyen de récupérer une liste de «mes images» pour commencer (par exemple, chaque image dans le registre public à l'étape 1). Je vais certainement explorer cette option, merci!
user134589
https://registry.hub.docker.com/search?q=*montre pour moi 87031 référentiels,
user2915097

Réponses:

81

Vous pouvez trouver les couches des images dans le dossier / var / lib / docker / aufs / couches; fournir si vous avez configuré le pilote de stockage en tant que aufs (option par défaut)

Exemple:

 docker ps -a
 CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
 0ca502fa6aae        ubuntu              "/bin/bash"         44 minutes ago      Exited (0) 44 seconds ago                       DockerTest

Maintenant, pour voir les couches des conteneurs qui ont été créées avec l'image "Ubuntu"; allez dans le répertoire / var / lib / docker / aufs / layer et cat le fichier commence par l'ID du conteneur (ici c'est 0ca502fa6aae *)

 root@viswesn-vm2:/var/lib/docker/aufs/layers# cat    0ca502fa6aaefc89f690736609b54b2f0fdebfe8452902ca383020e3b0d266f9-init 
 d2a0ecffe6fa4ef3de9646a75cc629bbd9da7eead7f767cb810f9808d6b3ecb6
 29460ac934423a55802fcad24856827050697b4a9f33550bd93c82762fb6db8f
 b670fb0c7ecd3d2c401fbfd1fa4d7a872fbada0a4b8c2516d0be18911c6b25d6
 83e4dde6b9cfddf46b75a07ec8d65ad87a748b98cf27de7d5b3298c1f3455ae4

Cela montrera le résultat de la même chose en exécutant

root@viswesn-vm2:/var/lib/docker/aufs/layers# docker history ubuntu
IMAGE               CREATED             CREATED BY                                         SIZE                COMMENT
d2a0ecffe6fa        13 days ago         /bin/sh -c #(nop) CMD ["/bin/bash"]             0 B                 
29460ac93442        13 days ago         /bin/sh -c sed -i 's/^#\s*\   (deb.*universe\)$/   1.895 kB            
b670fb0c7ecd        13 days ago         /bin/sh -c echo '#!/bin/sh' > /usr/sbin/polic   194.5 kB            
83e4dde6b9cf        13 days ago         /bin/sh -c #(nop) ADD file:c8f078961a543cdefa   188.2 MB 

Pour afficher l'ID de couche complet; exécuter avec l'option --no-trunc dans le cadre de la commande history.

docker history --no-trunc ubuntu
Viswesn
la source
1
Ce n'est plus le cas à partir de la version 1.10 de docker. docker historyLa commande ne donnera pas les couches d'image comme indiqué dans le dossier / var / lib / docker / aufs / couches. Lisez la mise à jour ici .
Ruifeng Ma
9
Depuis la version 1.10 de Docker, avec l'introduction du stockage adressable de contenu, les images et les couches sont désormais séparées. docker historyLa commande n'indique plus les informations de stockage sur le disque de couche réelle sur l'hôte docker. Consultez ce blog
Ruifeng Ma
52

Vous pouvez d'abord trouver l'ID de l'image en utilisant:

$ docker images -a

Recherchez ensuite les calques de l'image et leurs tailles:

$ docker history --no-trunc <Image ID>

Remarque: j'utilise la version 1.13.1 de Docker

$ docker -v
Docker version 1.13.1, build 092cba3
Yuci
la source
28

À mon avis, docker history <image>c'est suffisant. Cela renvoie la taille de chaque couche:

$ docker history jenkinsci-jnlp-slave:2019-1-9c
IMAGE        CREATED    CREATED BY                                    SIZE  COMMENT
93f48953d298 42 min ago /bin/sh -c #(nop)  USER jenkins               0B
6305b07d4650 42 min ago /bin/sh -c chown jenkins:jenkins -R /home/je… 1.45GB
030
la source
11

Ils ont une très bonne réponse ici: https://stackoverflow.com/a/32455275/165865

Exécutez simplement les images ci-dessous:

docker run --rm -v /var/run/docker.sock:/var/run/docker.sock nate/dockviz images -t
ensoleillécmf
la source
1
Salut @bummi, désolé, je pense que cette question cherche initialement une solution dans le registre docker, et j'ai trouvé la solution que nous avons fournie ci-dessus directement aux couches de l'image docker. alors j'essaie de compléter une autre solution (ce que je pense plus facile)
sunnycmf
7

Cela inspectera l'image du docker et imprimera les calques:

$ docker image inspect nginx -f '{{.RootFS.Layers}}'
[sha256:d626a8ad97a1f9c1f2c4db3814751ada64f60aed927764a3f994fcd88363b659 sha256:82b81d779f8352b20e52295afc6d0eab7e61c0ec7af96d85b8cda7800285d97d sha256:7ab428981537aa7d0c79bc1acbf208c71e57d9678f7deca4267cc03fba26b9c8]
lvthillo
la source
2
  1. https://hub.docker.com/search?q=* montre toutes les images dans tout le hub Docker, il n'est pas possible d'obtenir cela via la commande de recherche car elle n'accepte pas les caractères génériques.

  2. À partir de la v1.10, vous pouvez trouver toutes les couches d'une image en la tirant et en utilisant ces commandes:

    docker pull ubuntu
    ID=$(sudo docker inspect -f {{.Id}} ubuntu)
    jq .rootfs.diff_ids /var/lib/docker/image/aufs/imagedb/content/$(echo $ID|tr ':' '/')
    

3) La taille peut être trouvée dans /var/lib/docker/image/aufs/layerdb/sha256/{LAYERID}/sizebien que LAYERID! = Les diff_ids trouvés avec la commande précédente. Pour cela, vous devez regarder /var/lib/docker/image/aufs/layerdb/sha256/{LAYERID}/diffet comparer avec la sortie de la commande précédente pour correspondre correctement au diff_id et à la taille corrects.

Piet
la source
RE1) n'a pas fonctionné pour moi semble rediriger vers hub.docker.com.
joedragons
1
docker inspecter le nom de l'image | jq. []. RootFS.Layers "est une manière beaucoup plus simple de faire 2)
wheredidthatnamecomedu
2

Il est en effet possible d'interroger les informations du manifeste ou de l'objet blob à partir du serveur de registre docker sans extraire l'image sur le disque local.

Vous pouvez vous référer à l' API Registry v2 pour récupérer le manifeste de l'image.

GET /v2/<name>/manifests/<reference>

Notez que vous devez gérer une version de manifeste différente. Pour la v2, vous pouvez directement obtenir la taille du calque et le résumé du blob. Pour le manifeste v1 , vous pouvez HEAD l'URL de téléchargement de blob pour obtenir la taille réelle de la couche.

Il existe un script simple pour gérer les cas ci-dessus qui sera maintenu en permanence.

Kane
la source
0

Pas exactement la question d'origine mais pour trouver la somme totale de toutes les images sans compter deux fois les couches partagées, ce qui suit est utile (ubuntu 18):

sudo du -h -d1  /var/lib/docker/overlay2 | sort -h
Oliver
la source
-4

J'ai résolu ce problème en utilisant la fonction de recherche sur le site Web de Docker où «*» est une recherche valide qui renvoie 200 000 référentiels, puis j'ai analysé chaque page individuelle. L'analyse HTML me permet d'extraire tous les noms d'images sur chaque page.

Piet
la source