Trovare i livelli e le dimensioni dei livelli per ogni immagine Docker


112

A scopo di ricerca, sto cercando di eseguire la scansione del registro Docker pubblico ( https://registry.hub.docker.com/ ) e scoprire 1) quanti livelli ha un'immagine media e 2) le dimensioni di questi livelli per ottenere un idea della distribuzione.

Tuttavia ho studiato l'API e le biblioteche pubbliche così come i dettagli su GitHub ma non riesco a trovare alcun metodo per:

  • recuperare tutti i repository / immagini pubblici (anche se sono migliaia ho ancora bisogno di una lista di partenza per scorrere)
  • trova tutti gli strati di un'immagine
  • trova la dimensione per un livello (quindi non un'immagine ma per il singolo livello).

Qualcuno può aiutarmi a trovare un modo per recuperare queste informazioni?

Grazie!

EDIT: qualcuno è in grado di verificare che la ricerca di "*" nel registro Docker restituisce tutti i repository e non solo qualcosa che menziona "*" ovunque? https://registry.hub.docker.com/search?q=*


7
>>> trova tutti i livelli di un'immagine, se non usi l'API, puoi fare un docker history myimagee vedrai la dimensione di ogni livello. Più in generale, su un'immagine, si può fare docker history myimage | awk 'NR>1 {print $1}' | xargs docker inspect --format '{{ ((index .ContainerConfig.Cmd ) 0) }}'per vedere quali comandi sono stati emessi per creare l'immagine
user2915097

Questo è già di grande aiuto per il passaggio 2, sebbene ciò richieda il download di ogni immagine tramite Docker sul mio computer locale. Immagino che sia un'opzione, ma solo se trovo un modo per recuperare un elenco di "mie immagini" con cui iniziare (ad esempio, ogni immagine nel registro pubblico nel passaggio 1). Esplorerò sicuramente questa opzione, grazie!
user134589

https://registry.hub.docker.com/search?q=*mostra per me 87031 repository,
user2915097

Risposte:


82

Puoi trovare i livelli delle immagini nella cartella / var / lib / docker / aufs / layers; fornire se configurato per il driver di archiviazione come aufs (opzione predefinita)

Esempio:

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

Ora per visualizzare i livelli dei contenitori che sono stati creati con l'immagine "Ubuntu"; vai alla directory / var / lib / docker / aufs / layers e cat il file inizia con l'ID del contenitore (qui è 0ca502fa6aae *)

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

Questo mostrerà il risultato dello stesso eseguendo

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 

Per visualizzare l'ID del livello completo; eseguire con l'opzione --no-trunc come parte del comando history.

docker history --no-trunc ubuntu

2
Questo non è più il caso con la docker versione 1.10 in poi. docker historyIl comando non fornirà i livelli dell'immagine come mostrato nella cartella / var / lib / docker / aufs / layers. Leggi l'aggiornamento qui .
Ruifeng Ma

10
Dalla versione di Docker 1.10, con l'introduzione dell'archiviazione indirizzabile dei contenuti, le immagini e i livelli sono ora separati. docker historyIl comando non indica più le informazioni di archiviazione su disco del livello effettivo sull'host Docker. Controlla questo blog
Ruifeng Ma


54

Puoi prima trovare l'ID immagine utilizzando:

$ docker images -a

Quindi trova i livelli dell'immagine e le loro dimensioni:

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

Nota: sto usando Docker versione 1.13.1

$ docker -v
Docker version 1.13.1, build 092cba3

29

Secondo me docker history <image>è sufficiente. Questo restituisce la dimensione di ogni strato:

$ 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

11

Hanno un'ottima risposta qui: https://stackoverflow.com/a/32455275/165865

Basta eseguire le immagini sotto:

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

1
Ciao @bummi, mi dispiace, penso che questa domanda inizialmente stia cercando una soluzione nel registro di finestra mobile e ho trovato quella soluzione che abbiamo fornito sopra direttamente ai livelli dell'immagine finestra mobile. quindi cerco di integrare un'altra soluzione (che penso sia più semplice)
sunnycmf

7

Questo ispezionerà l'immagine docker e stamperà i livelli:

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


2
  1. https://hub.docker.com/search?q=* mostra tutte le immagini nell'intero hub Docker, non è possibile ottenerlo tramite il comando di ricerca in quanto non accetta caratteri jolly.

  2. A partire dalla v1.10 puoi trovare tutti i livelli in un'immagine tirandola e usando questi comandi:

    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 dimensione può essere trovata in /var/lib/docker/image/aufs/layerdb/sha256/{LAYERID}/sizesebbene LAYERID! = Diff_ids trovati con il comando precedente. Per questo è necessario guardare /var/lib/docker/image/aufs/layerdb/sha256/{LAYERID}/diffe confrontare con l'output del comando precedente per abbinare correttamente il diff_id e la dimensione corretti.


RE1) Non ha funzionato per me sembra reindirizzare a hub.docker.com.
joedragons

1
finestra mobile ispeziona nome immagine | jq. []. RootFS.Layers "è un modo molto più semplice per farlo 2)
wheredidthatnamecome from

2

È effettivamente possibile eseguire una query sul manifest o sulle informazioni del blob dal server del registro Docker senza estrarre l'immagine sul disco locale.

Puoi fare riferimento all'API Registry v2 per recuperare il manifesto dell'immagine.

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

Nota, devi gestire diverse versioni di manifest. Per v2 puoi ottenere direttamente la dimensione del layer e il digest del blob. Per il manifest v1 , puoi TESTARE l'URL di download del blob per ottenere la dimensione effettiva del livello.

C'è un semplice script per la gestione dei casi di cui sopra che verrà mantenuto continuamente.


0

Non esattamente la domanda originale ma per trovare la somma totale di tutte le immagini senza contare due volte i livelli condivisi, è utile quanto segue (ubuntu 18):

sudo du -h -d1  /var/lib/docker/overlay2 | sort -h

-4

Ho risolto questo problema utilizzando la funzione di ricerca sul sito Web di Docker dove "*" è una ricerca valida che restituisce 200k repository e quindi ho eseguito la scansione di ogni singola pagina. L'analisi HTML mi consente di estrarre tutti i nomi delle immagini su ciascuna pagina.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.