การค้นหาเลเยอร์และขนาดเลเยอร์สำหรับอิมเมจ Docker แต่ละภาพ


123

เพื่อจุดประสงค์ในการวิจัยฉันพยายามรวบรวมข้อมูลรีจิสทรีของ Docker สาธารณะ ( https://registry.hub.docker.com/ ) และค้นหา 1) จำนวนภาพเฉลี่ยมีกี่ชั้นและ 2) ขนาดของเลเยอร์เหล่านี้เพื่อให้ได้ ความคิดของการกระจาย

อย่างไรก็ตามฉันได้ศึกษา API และไลบรารีสาธารณะรวมถึงรายละเอียดเกี่ยวกับ github แต่ฉันไม่พบวิธีใดในการ

  • ดึงข้อมูลที่เก็บ / รูปภาพสาธารณะทั้งหมด (แม้ว่าจะมีจำนวนหลายพันฉันก็ยังต้องการรายการเริ่มต้นเพื่อทำซ้ำ)
  • ค้นหาเลเยอร์ทั้งหมดของรูปภาพ
  • ค้นหาขนาดของเลเยอร์ (ไม่ใช่รูปภาพ แต่สำหรับแต่ละเลเยอร์)

ใครสามารถช่วยฉันหาวิธีดึงข้อมูลนี้

ขอบคุณ!

แก้ไข: ทุกคนสามารถตรวจสอบได้หรือไม่ว่าการค้นหา '*' ใน Docker Registry กำลังส่งคืนที่เก็บทั้งหมดไม่ใช่แค่สิ่งที่กล่าวถึง '*' ที่ใดก็ได้? https://registry.hub.docker.com/search?q=*


8
>>> ค้นหาเลเยอร์ทั้งหมดของรูปภาพหากคุณไม่ได้ใช้ API คุณสามารถทำdocker history myimageและคุณจะเห็นขนาดของแต่ละเลเยอร์ โดยทั่วไปแล้วในรูปภาพคุณสามารถทำได้docker history myimage | awk 'NR>1 {print $1}' | xargs docker inspect --format '{{ ((index .ContainerConfig.Cmd ) 0) }}'เพื่อดูว่ามีคำสั่งใดบ้างที่ออกมาเพื่อสร้างรูปภาพ
user2915097

นี่เป็นความช่วยเหลือที่ดีเยี่ยมสำหรับขั้นตอนที่ 2 แม้ว่าจะต้องการให้ฉันดาวน์โหลดทุกภาพผ่าน Docker ไปยังเครื่องในพื้นที่ของฉัน ฉันเดาว่าเป็นตัวเลือก แต่ถ้าฉันหาวิธีดึงรายการ 'myimages' เพื่อเริ่มต้นด้วย (เช่นทุกภาพในรีจิสทรีสาธารณะในขั้นตอนที่ 1) ฉันจะสำรวจตัวเลือกนี้อย่างแน่นอนขอบคุณ!
user134589

https://registry.hub.docker.com/search?q=*แสดงให้ฉันเห็นที่เก็บ 87031
user2915097

คำตอบ:


86

คุณสามารถค้นหาเลเยอร์ของรูปภาพในโฟลเดอร์ / var / lib / docker / aufs / layer; ระบุว่าคุณกำหนดค่าสำหรับไดร์เวอร์สตอเรจเป็น aufs หรือไม่ (ตัวเลือกเริ่มต้น)

ตัวอย่าง:

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

ตอนนี้เพื่อดูเลเยอร์ของคอนเทนเนอร์ที่สร้างขึ้นด้วยอิมเมจ "Ubuntu"; ไปที่ไดเร็กทอรี / var / lib / docker / aufs / layer และ cat ไฟล์ขึ้นต้นด้วย ID คอนเทนเนอร์ (ในที่นี้คือ 0ca502fa6aae *)

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

สิ่งนี้จะแสดงผลลัพธ์เดียวกันโดยการเรียกใช้

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 

หากต้องการดู ID เลเยอร์แบบเต็ม รันด้วยอ็อพชัน --no-trunc เป็นส่วนหนึ่งของคำสั่ง history

docker history --no-trunc ubuntu

2
นี่ไม่ใช่กรณีของนักเทียบท่ารุ่น 1.10 เป็นต้นไปอีกต่อไป docker historyคำสั่งจะไม่ให้เลเยอร์รูปภาพดังที่แสดงในโฟลเดอร์ / var / lib / docker / aufs / layer อ่านการปรับปรุงที่นี่
Ruifeng Ma

10
ตั้งแต่ Docker เวอร์ชัน 1.10 ด้วยการเปิดตัวที่จัดเก็บข้อมูลแบบแอดเดรสเนื้อหาตอนนี้รูปภาพและเลเยอร์จะแยกออกจากกัน docker historyคำสั่งไม่บอกข้อมูลการจัดเก็บดิสก์เลเยอร์จริงบนโฮสต์นักเทียบท่าอีกต่อไป ตรวจสอบบล็อก
Ruifeng Ma


61

ก่อนอื่นคุณสามารถค้นหารหัสรูปภาพโดยใช้:

$ docker images -a

จากนั้นค้นหาเลเยอร์และขนาดของรูปภาพ:

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

หมายเหตุ: ฉันใช้ Docker เวอร์ชัน 1.13.1

$ docker -v
Docker version 1.13.1, build 092cba3

33

ในความคิดของฉันdocker history <image>ก็เพียงพอแล้ว สิ่งนี้ส่งคืนขนาดของแต่ละเลเยอร์:

$ 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

พวกเขามีคำตอบที่ดีมากที่นี่: https://stackoverflow.com/a/32455275/165865

เพียงแค่เรียกใช้ภาพด้านล่าง:

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

1
สวัสดี @bummi ขอโทษฉันคิดว่าคำถามนี้ในตอนแรกกำลังมองหาวิธีแก้ปัญหาในการลงทะเบียนนักเทียบท่าและฉันพบว่าโซลูชันที่เราให้ไว้ข้างต้นส่งตรงไปยังเลเยอร์ของภาพนักเทียบท่า ดังนั้นฉันจึงพยายามเสริมวิธีอื่น (ซึ่งฉันคิดว่าง่ายกว่า)
sunnycmf

8

สิ่งนี้จะตรวจสอบอิมเมจนักเทียบท่าและพิมพ์เลเยอร์:

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


2
  1. https://hub.docker.com/search?q=*แสดงภาพทั้งหมดในฮับ Docker ทั้งหมดไม่สามารถรับสิ่งนี้ผ่านคำสั่งค้นหาเนื่องจากไม่ยอมรับสัญลักษณ์แทน

  2. ตั้งแต่ v1.10 คุณสามารถค้นหาเลเยอร์ทั้งหมดในรูปภาพได้โดยการดึงและใช้คำสั่งเหล่านี้:

    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) ขนาดสามารถพบได้ใน/var/lib/docker/image/aufs/layerdb/sha256/{LAYERID}/sizeแม้ว่า LAYERID! = diff_ids ที่พบด้วยคำสั่งก่อนหน้า สำหรับสิ่งนี้คุณต้องดู/var/lib/docker/image/aufs/layerdb/sha256/{LAYERID}/diffและเปรียบเทียบกับเอาต์พุตคำสั่งก่อนหน้าเพื่อจับคู่ diff_id และขนาดที่ถูกต้อง


RE1) ไม่ได้ผลสำหรับฉันดูเหมือนว่าจะเปลี่ยนเส้นทางไปที่ hub.docker.com
joedragons

1
นักเทียบท่าตรวจสอบชื่อจินตนาการ | jq. []. RootFS.Layers "เป็นวิธีที่ง่ายกว่ามากในการทำ 2)
wheredidthatnamecome จาก

2

เป็นไปได้ที่จะค้นหารายการหรือข้อมูลหยดจากเซิร์ฟเวอร์รีจิสทรีนักเทียบท่าโดยไม่ต้องดึงภาพไปยังดิสก์ภายในเครื่อง

คุณสามารถอ้างถึงRegistry v2 APIเพื่อดึงรายการของรูปภาพ

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

หมายเหตุคุณต้องจัดการไฟล์ Manifest ที่แตกต่างกัน สำหรับv2คุณสามารถรับขนาดของเลเยอร์และย่อยของหยดได้โดยตรง สำหรับรายการ v1คุณสามารถ HEAD URL ดาวน์โหลด blob เพื่อรับขนาดเลเยอร์จริง

มีสคริปต์ง่ายๆสำหรับจัดการกรณีข้างต้นที่จะได้รับการดูแลอย่างต่อเนื่อง


0

ไม่ใช่คำถามเดิม แต่เพื่อหาผลรวมของภาพทั้งหมดโดยไม่ต้องนับเลเยอร์ที่ใช้ร่วมกันสองครั้งสิ่งต่อไปนี้มีประโยชน์ (อูบุนตู 18):

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

-4

ฉันได้แก้ไขปัญหานี้โดยใช้ฟังก์ชันการค้นหาบนเว็บไซต์ของ Docker โดยที่ '*' เป็นการค้นหาที่ถูกต้องซึ่งส่งคืนที่เก็บข้อมูล 200k จากนั้นฉันก็รวบรวมข้อมูลแต่ละหน้าที่ไม่ถูกต้อง การแยกวิเคราะห์ HTML ทำให้ฉันสามารถแยกชื่อรูปภาพทั้งหมดในแต่ละหน้าได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.