Menemukan lapisan dan ukuran lapisan untuk setiap gambar Docker

112

Untuk tujuan penelitian, saya mencoba merayapi registri Docker publik ( https://registry.hub.docker.com/ ) dan mencari tahu 1) berapa banyak lapisan yang dimiliki gambar rata-rata dan 2) ukuran lapisan ini untuk mendapatkan ide distribusi.

Namun saya mempelajari API dan perpustakaan umum serta detail di github tetapi saya tidak dapat menemukan metode apa pun untuk:

  • ambil semua repositori / gambar publik (meskipun jumlahnya ribuan, saya masih memerlukan daftar awal untuk mengulang)
  • temukan semua lapisan gambar
  • temukan ukuran untuk sebuah lapisan (jadi bukan gambar tetapi untuk lapisan individu).

Adakah yang bisa membantu saya menemukan cara untuk mendapatkan kembali informasi ini?

Terima kasih!

EDIT: adakah yang dapat memverifikasi bahwa mencari '*' di registri Docker mengembalikan semua repositori dan bukan sembarang yang menyebutkan '*' di mana saja? https://registry.hub.docker.com/search?q=*

pengguna134589
sumber
7
>>> temukan semua lapisan gambar, jika Anda tidak menggunakan API, Anda dapat melakukan docker history myimagedan Anda akan melihat ukuran setiap lapisan. Secara lebih umum, pada gambar, Anda dapat melakukan docker history myimage | awk 'NR>1 {print $1}' | xargs docker inspect --format '{{ ((index .ContainerConfig.Cmd ) 0) }}'untuk melihat perintah apa yang dikeluarkan untuk membuat gambar
pengguna2915097
Ini sudah sangat membantu untuk langkah 2 meskipun itu mengharuskan saya untuk mengunduh setiap gambar melalui Docker ke mesin lokal saya. Saya rasa itu adalah opsi tetapi hanya jika saya menemukan cara untuk mengambil daftar 'myimages' untuk memulai (mis. Setiap gambar di registri publik di langkah 1). Saya pasti akan menjelajahi opsi ini, terima kasih!
pengguna134589
https://registry.hub.docker.com/search?q=*menunjukkan kepada saya 87031 repositori,
pengguna2915097

Jawaban:

82

Anda dapat menemukan lapisan gambar di folder / var / lib / docker / aufs / layers; berikan jika Anda mengkonfigurasi untuk driver penyimpanan sebagai aufs (opsi default)

Contoh:

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

Sekarang untuk melihat lapisan wadah yang dibuat dengan gambar "Ubuntu"; pergi ke / var / lib / docker / aufs / layers direktori dan cat file dimulai dengan ID penampung (ini dia 0ca502fa6aae *)

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

Ini akan menunjukkan hasil yang sama dengan berlari

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 

Untuk melihat ID lapisan penuh; dijalankan dengan opsi --no-trunc sebagai bagian dari perintah history.

docker history --no-trunc ubuntu
Viswesn
sumber
2
Ini tidak lagi menjadi kasus dengan buruh pelabuhan versi 1.10 dan seterusnya. docker historyperintah tidak akan memberikan lapisan gambar seperti yang ditunjukkan di folder / var / lib / docker / aufs / layers. Baca pembaruannya di sini .
Ruifeng Ma
10
Sejak Docker versi 1.10, dengan pengenalan penyimpanan beralamat konten, gambar dan lapisan sekarang dipisahkan. docker historyperintah tidak lagi memberitahu informasi penyimpanan lapisan disk yang sebenarnya pada host buruh pelabuhan. Periksa blog
Ruifeng Ma
54

Lihat penyelaman yang ditulis dalam golang.

Alat yang luar biasa!

Levon
sumber
54

Anda dapat menemukan ID gambar terlebih dahulu menggunakan:

$ docker images -a

Kemudian temukan lapisan gambar dan ukurannya:

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

Catatan: Saya menggunakan Docker versi 1.13.1

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

Menurut saya, docker history <image>sudah cukup. Ini mengembalikan ukuran setiap lapisan:

$ 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
sumber
11

Mereka memiliki jawaban yang sangat bagus di sini: https://stackoverflow.com/a/32455275/165865

Jalankan saja gambar di bawah ini:

docker run --rm -v /var/run/docker.sock:/var/run/docker.sock nate/dockviz images -t
sunnycmf
sumber
1
Hai @bummi, maaf saya pikir pertanyaan ini awalnya mencari solusi di registri buruh pelabuhan, dan saya menemukan bahwa solusi yang kami berikan di atas langsung ke lapisan gambar buruh pelabuhan. jadi saya mencoba untuk melengkapi solusi lain (yang menurut saya lebih mudah)
sunnycmf
7

Ini akan memeriksa gambar buruh pelabuhan dan mencetak lapisan:

$ docker image inspect nginx -f '{{.RootFS.Layers}}'
[sha256:d626a8ad97a1f9c1f2c4db3814751ada64f60aed927764a3f994fcd88363b659 sha256:82b81d779f8352b20e52295afc6d0eab7e61c0ec7af96d85b8cda7800285d97d sha256:7ab428981537aa7d0c79bc1acbf208c71e57d9678f7deca4267cc03fba26b9c8]
lvthillo.dll
sumber
2
  1. https://hub.docker.com/search?q=* menampilkan semua gambar di seluruh hub Docker, tidak mungkin mendapatkannya melalui perintah pencarian karena tidak menerima wildcard.

  2. Mulai v1.10 Anda dapat menemukan semua lapisan dalam gambar dengan menariknya dan menggunakan perintah berikut:

    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) Ukuran dapat ditemukan /var/lib/docker/image/aufs/layerdb/sha256/{LAYERID}/sizemeskipun LAYERID! = Diff_ids ditemukan dengan perintah sebelumnya. Untuk ini, Anda perlu melihat /var/lib/docker/image/aufs/layerdb/sha256/{LAYERID}/diffdan membandingkan dengan keluaran perintah sebelumnya agar sesuai dengan diff_id dan ukuran yang benar.

Piet
sumber
RE1) Sepertinya saya tidak berhasil mengarahkan ke hub.docker.com.
joedragons
1
buruh pelabuhan memeriksa imagename | jq. []. RootFS.Layers "adalah cara yang jauh lebih sederhana untuk dilakukan 2)
nama itu berasal dari
2

Memang dapat dilakukan untuk menanyakan info manifes atau blob dari server registri buruh pelabuhan tanpa menarik gambar ke disk lokal.

Anda dapat merujuk ke Registry v2 API untuk mengambil manifes gambar.

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

Catatan, Anda harus menangani versi manifes yang berbeda. Untuk v2 Anda bisa langsung mendapatkan ukuran layer dan digest dari blob. Untuk manifes v1 , Anda dapat mengepalai url unduhan blob untuk mendapatkan ukuran lapisan yang sebenarnya.

Ada script sederhana untuk menangani kasus-kasus di atas yang akan terus dipertahankan.

Kane
sumber
0

Bukan pertanyaan asli tetapi untuk menemukan jumlah total semua gambar tanpa lapisan bersama penghitungan ganda, berikut ini berguna (ubuntu 18):

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

Saya telah memecahkan masalah ini dengan menggunakan fungsi pencarian di situs Docker di mana '*' adalah pencarian valid yang mengembalikan 200k repositori dan kemudian saya merayapi setiap halaman invididual. Penguraian HTML memungkinkan saya mengekstrak semua nama gambar di setiap halaman.

Piet
sumber