Her Docker görüntüsü için katmanları ve katman boyutlarını bulma


123

Araştırma amacıyla, genel Docker kayıt defterini ( https://registry.hub.docker.com/ ) taramaya ve 1) ortalama bir görüntünün kaç katmana sahip olduğunu ve 2) bu katmanların boyutlarını bulmaya çalışıyorum. dağıtım fikri.

Bununla birlikte, API ve halk kütüphaneleri ile birlikte github'daki ayrıntıları inceledim, ancak aşağıdakileri yapmak için herhangi bir yöntem bulamıyorum:

  • tüm genel depoları / görüntüleri geri al (bunlar binlerce olsa bile yinelemek için bir başlangıç ​​listesine ihtiyacım var)
  • bir görüntünün tüm katmanlarını bul
  • bir katmanın boyutunu bulun (yani bir görüntü değil, tek bir katman için).

Bu bilgileri almam için bana yardım eden var mı?

Teşekkür ederim!

DÜZENLEME: Docker kayıt defterinde '*' aramanın, yalnızca herhangi bir yerde '*' yazan herhangi bir şeyi değil, tüm depoları döndürdüğünü doğrulayan var mı? https://registry.hub.docker.com/search?q=*


8
>>> bir görüntünün tüm katmanlarını bulun, API kullanmıyorsanız, bir yapabilir docker history myimageve her katmanın boyutunu göreceksiniz. Daha genel olarak, bir görüntüde, görüntüyü docker history myimage | awk 'NR>1 {print $1}' | xargs docker inspect --format '{{ ((index .ContainerConfig.Cmd ) 0) }}'oluşturmak için hangi komutların verildiğini görmek için yapabilirsiniz
user2915097

Bu, her görüntüyü Docker aracılığıyla yerel makineme indirmemi gerektirse de, bu 2. adım için zaten harika bir yardım. Sanırım bu bir seçenek, ancak yalnızca başlamak için bir 'resimlerim' listesini almanın bir yolunu bulursam (örneğin, 1. adımda herkese açık kayıt defterindeki her görüntü). Bu seçeneği kesinlikle keşfedeceğim, teşekkürler!
user134589

https://registry.hub.docker.com/search?q=*87031 depoları benim için gösteriyor,
user2915097

Yanıtlar:


86

Görüntülerin katmanlarını / var / lib / docker / aufs / layer klasöründe bulabilirsiniz; aufs (varsayılan seçenek) olarak depolama sürücüsü için yapılandırdıysanız sağlayın

Misal:

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

Şimdi "Ubuntu" görüntüsü ile oluşturulmuş kapların katmanlarını görmek için; / var / lib / docker / aufs / layer dizinine gidin ve dosyanın kapsayıcı kimliği ile başladığını cat (burada 0ca502fa6aae *)

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

Bu koşarak aynı sonucu gösterecek

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 

Tam katman kimliğini görüntülemek için; geçmiş komutunun bir parçası olarak --no-trunc seçeneğiyle çalıştırın.

docker history --no-trunc ubuntu

2
Docker 1.10 sürümünden itibaren durum artık böyle değil. docker historykomutu / var / lib / docker / aufs / layer klasöründe gösterildiği gibi görüntü katmanlarını vermez. Güncellemeyi buradan okuyun .
Ruifeng Ma

10
Docker sürüm 1.10'dan beri, adreslenebilir depolama içeriğinin sunulmasıyla birlikte görüntüler ve katmanlar artık ayrılmıştır. docker historycommand artık docker ana bilgisayarındaki gerçek katman disk depolama bilgilerini söylemiyor. Bu bloga göz
Ruifeng Ma


61

Görsel kimliğini ilk olarak şunları kullanarak bulabilirsiniz:

$ docker images -a

Ardından görüntünün katmanlarını ve boyutlarını bulun:

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

Not: Docker 1.13.1 sürümünü kullanıyorum

$ docker -v
Docker version 1.13.1, build 092cba3

33

Bence docker history <image>yeterli. Bu, her katmanın boyutunu döndürür:

$ 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

Burada çok iyi bir cevapları var: https://stackoverflow.com/a/32455275/165865

Sadece resimlerin altında çalıştırın:

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

1
Merhaba @bummi, üzgünüm, bu sorunun başlangıçta docker kayıt defterinde çözüm aradığını düşünüyorum ve yukarıda sağladığımız çözümü doğrudan docker görüntüsünün katmanlarına buldum. bu yüzden başka bir çözümü tamamlamaya çalışıyorum (ki daha kolay olduğunu düşünüyorum)
sunnycmf

8

Bu, docker görüntüsünü inceleyecek ve katmanları yazdıracaktır:

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


2
  1. https://hub.docker.com/search?q=* tüm Docker hub'ındaki tüm görüntüleri gösterir, joker karakterleri kabul etmediği için bunu search komutu aracılığıyla almak mümkün değildir.

  2. V1.10'dan itibaren bir görüntüdeki tüm katmanları çekerek ve şu komutları kullanarak bulabilirsiniz:

    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) Boyut, /var/lib/docker/image/aufs/layerdb/sha256/{LAYERID}/sizeLAYERID! = Önceki komutta bulunan diff_ids olmasına rağmen bulunabilir. Bunun için /var/lib/docker/image/aufs/layerdb/sha256/{LAYERID}/diffdoğru diff_id ve boyut ile doğru şekilde eşleşmesi için önceki komut çıktısına bakmanız ve onunla karşılaştırmanız gerekir .


RE1) Benim için işe yaramadı, hub.docker.com'a yönlendiriyor gibi görünüyor.
joedragons

1
docker imagename incelemek | jq. []. RootFS.Layers "bunu yapmanın çok daha basit bir yoludur 2)
wheredidthatnamecome

2

Bu liman işçisi kayıt sunucusundan tezahür veya blob bilgisi sorgulamak için gerçekten başarmak mümkün olmayan yerel diske görüntü çekerek.

Görüntünün bildirimini almak için Registry v2 API'ye başvurabilirsiniz .

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

Not, farklı manifest sürümünü işlemeniz gerekir. İçin v2 doğrudan katmanın boyutunu alabilir ve blob'un sindirmek. İçin v1 tezahür , gerçek katman boyutunu almak için blob indir url baş edebilirsiniz.

Sürekli olarak sürdürülecek yukarıdaki durumları ele almak için basit bir komut dosyası vardır .


0

Tam olarak orijinal soru değil, paylaşılan katmanları iki kez saymadan tüm görüntülerin toplamını bulmak için aşağıdakiler yararlıdır (ubuntu 18):

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

-4

Bu sorunu Docker web sitesinde arama işlevini kullanarak çözdüm, burada '*' 200 bin depo döndüren geçerli bir arama ve ardından her bir bireysel sayfayı taradım. HTML ayrıştırma, her sayfadaki tüm resim adlarını çıkarmama izin veriyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.