it-swarm.com.de

Suchen der Ebenen und Ebenengrößen für jedes Docker-Bild

Zu Forschungszwecken versuche ich, die öffentliche Docker-Registry ( https://registry.hub.docker.com/ ) zu crawlen und herauszufinden, 1) wie viele Ebenen ein durchschnittliches Bild hat und 2) die Größe dieser Schichten, um eine Vorstellung von der Verteilung zu bekommen.

Ich habe jedoch die API und die öffentlichen Bibliotheken sowie die Details zu Github studiert, aber ich kann keine Methode finden, um:

  • alle öffentlichen Repositorys/Bilder abrufen (selbst wenn es sich um Tausende handelt, brauche ich immer noch eine Startliste, um durchzugehen)
  • finde alle Ebenen eines Bildes
  • finden Sie die Größe für eine Ebene (also kein Bild, sondern für die einzelne Ebene).

Kann mir jemand helfen, einen Weg zu finden, um diese Informationen abzurufen?

Vielen Dank!

BEARBEITEN: Kann jemand überprüfen, ob bei der Suche nach '*' in der Docker-Registrierung alle Repositorys zurückgegeben werden und nicht irgendetwas, das '*' irgendwo erwähnt? https://registry.hub.docker.com/search?q=*

55
user134589

Sie finden die Ebenen der Bilder im Ordner/var/lib/docker/aufs/layer. Geben Sie an, ob Sie den Speichertreiber als aufs konfiguriert haben (Standardoption). 

Beispiel:

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

Nun können Sie die Ebenen der Container anzeigen, die mit dem Bild "Ubuntu" erstellt wurden. Gehen Sie in das Verzeichnis/var/lib/docker/aufs/Layers, und die Datei beginnt mit der Container-ID (hier ist 0ca502fa6aae *).

 [email protected]:/var/lib/docker/aufs/layers# cat    0ca502fa6aaefc89f690736609b54b2f0fdebfe8452902ca383020e3b0d266f9-init 
 d2a0ecffe6fa4ef3de9646a75cc629bbd9da7eead7f767cb810f9808d6b3ecb6
 29460ac934423a55802fcad24856827050697b4a9f33550bd93c82762fb6db8f
 b670fb0c7ecd3d2c401fbfd1fa4d7a872fbada0a4b8c2516d0be18911c6b25d6
 83e4dde6b9cfddf46b75a07ec8d65ad87a748b98cf27de7d5b3298c1f3455ae4

Dies zeigt das Ergebnis des Laufens 

[email protected]:/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 

So zeigen Sie die vollständige Layer-ID an; Führen Sie die Option --no-trunc als Teil des Befehls history aus.

docker history --no-trunc ubuntu
57
Viswesn

Hier ist ein guter Artikel über Layer von Docker Image anzeigen

Sie können zuerst die Bild-ID finden:

$ docker images -a

Dann finden Sie die Ebenen und ihre Größen:

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

Hinweis: Ich verwende Docker Version 1.13.1

$ docker -v
Docker version 1.13.1, build 092cba3
15
Yuci

Sie haben hier eine sehr gute Antwort: https://stackoverflow.com/a/32455275/165865

Laufen Sie einfach unter den Bildern:

docker run --rm -v /var/run/docker.sock:/var/run/docker.sock nate/dockviz images -t
9
sunnycmf

Dadurch wird das Andockbild überprüft und die Ebenen gedruckt:

$ docker image inspect nginx -f '{{.RootFS.Layers}}'
[sha256:d626a8ad97a1f9c1f2c4db3814751ada64f60aed927764a3f994fcd88363b659 sha256:82b81d779f8352b20e52295afc6d0eab7e61c0ec7af96d85b8cda7800285d97d sha256:7ab428981537aa7d0c79bc1acbf208c71e57d9678f7deca4267cc03fba26b9c8]
4
lvthillo

Meiner Meinung nach reicht docker history <image> aus. Dies gibt die Größe jeder Ebene zurück.

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

Was mich überraschte, war, dass der Besitzer der Besitzerin einen riesigen Fleck erzeugt hat.

2
030
  1. https://hub.docker.com/search?q=* zeigt alle Bilder im gesamten Docker-Hub. Es ist nicht möglich, dies über den Suchbefehl zu erhalten, da Wildcards nicht akzeptiert werden.

  2. Ab v1.10 können Sie alle Ebenen in einem Bild finden, indem Sie es ziehen und die folgenden Befehle verwenden:

    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) Die Größe kann in /var/lib/docker/image/aufs/layerdb/sha256/{LAYERID}/size gefunden werden, obwohl LAYERID! = Die mit dem vorherigen Befehl gefundenen diff_ids. Zu diesem Zweck müssen Sie sich /var/lib/docker/image/aufs/layerdb/sha256/{LAYERID}/diff ansehen und mit der vorherigen Befehlsausgabe vergleichen, um die korrekte diff_id und die richtige Größe zu ermitteln.

2
Piet

ein weiteres Werkzeug: https://github.com/CenturyLinkLabs/dockerfile-from-image

GUI mit ImageLayers.io 

1
resultsway

Kann auschecken tauchen in Golang schreiben. 

Tolles Werkzeug.

Sie können den Quellcode so anpassen, dass er alle angezeigten Informationen in eine json-Datei exportiert.

0
Levon