Tìm các lớp và kích thước lớp cho mỗi hình ảnh Docker


108

Vì mục đích nghiên cứu, tôi đang cố gắng thu thập thông tin đăng ký Docker công khai ( https://registry.hub.docker.com/ ) và tìm hiểu 1) hình ảnh trung bình có bao nhiêu lớp và 2) kích thước của các lớp này để có được ý tưởng về việc phân phối.

Tuy nhiên, tôi đã nghiên cứu API và thư viện công cộng cũng như các chi tiết trên github nhưng tôi không thể tìm thấy bất kỳ phương pháp nào để:

  • truy xuất tất cả các kho lưu trữ / hình ảnh công khai (ngay cả khi hàng nghìn kho lưu trữ đó, tôi vẫn cần một danh sách bắt đầu để lặp lại)
  • tìm tất cả các lớp của một hình ảnh
  • tìm kích thước cho một lớp (vì vậy không phải là một hình ảnh mà cho từng lớp).

Bất cứ ai có thể giúp tôi tìm cách lấy lại thông tin này?

Cảm ơn bạn!

CHỈNH SỬA: có ai có thể xác minh rằng tìm kiếm '*' trong sổ đăng ký Docker đang trả về tất cả các kho lưu trữ và không chỉ bất cứ thứ gì đề cập đến '*' ở bất cứ đâu không? https://registry.hub.docker.com/search?q=*


7
>>> tìm tất cả các lớp của một hình ảnh, nếu bạn không sử dụng API, bạn có thể thực hiện docker history myimagevà bạn sẽ thấy kích thước của mỗi lớp. Tổng quát hơn, vào một hình ảnh, bạn có thể làm docker history myimage | awk 'NR>1 {print $1}' | xargs docker inspect --format '{{ ((index .ContainerConfig.Cmd ) 0) }}'để xem những gì các lệnh đã được ban hành để tạo ra các hình ảnh
user2915097

Đây đã là một trợ giúp tuyệt vời cho bước 2 mặc dù điều đó yêu cầu tôi tải mọi hình ảnh thông qua Docker vào máy cục bộ của mình. Tôi đoán đó là một tùy chọn nhưng chỉ khi tôi tìm được cách truy xuất danh sách 'myimages' để bắt đầu (ví dụ: mọi hình ảnh trong sổ đăng ký công khai ở bước 1). Tôi chắc chắn sẽ khám phá tùy chọn này, cảm ơn bạn!
user134589

https://registry.hub.docker.com/search?q=*hiển thị cho tôi 87031 kho lưu trữ,
user2915097

Câu trả lời:


81

Bạn có thể tìm thấy các lớp của hình ảnh trong thư mục / var / lib / docker / aufs / layer; cung cấp nếu bạn đã định cấu hình cho trình điều khiển lưu trữ dưới dạng aufs (tùy chọn mặc định)

Thí dụ:

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

Bây giờ để xem các lớp của vùng chứa đã được tạo với hình ảnh "Ubuntu"; vào thư mục / var / lib / docker / aufs / Layer và bắt đầu tệp bằng ID vùng chứa (ở đây là 0ca502fa6aae *)

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

Điều này sẽ hiển thị kết quả tương tự bằng cách chạy

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 

Để xem ID lớp đầy đủ; chạy với tùy chọn --no-trunc như một phần của lệnh history.

docker history --no-trunc ubuntu

1
Điều này không còn xảy ra với phiên bản docker 1.10 trở đi. docker historylệnh sẽ không cung cấp các lớp hình ảnh như được hiển thị trong thư mục / var / lib / docker / aufs / layer. Đọc bản cập nhật ở đây .
Ruifeng Ma

9
Kể từ phiên bản Docker 1.10, với việc giới thiệu bộ nhớ theo địa chỉ nội dung, hình ảnh và các lớp hiện được tách biệt. docker historylệnh không còn cho biết thông tin lưu trữ đĩa lớp thực tế trên máy chủ docker. Kiểm tra blog
Ruifeng Ma

52

Trước tiên, bạn có thể tìm thấy ID hình ảnh bằng cách sử dụng:

$ docker images -a

Sau đó, tìm các lớp của hình ảnh và kích thước của chúng:

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

Lưu ý: Tôi đang sử dụng Docker phiên bản 1.13.1

$ docker -v
Docker version 1.13.1, build 092cba3

47

Kiểm tra lặn được viết bằng golang.

Công cụ tuyệt vời!


28

Theo tôi, docker history <image>là đủ. Điều này trả về kích thước của mỗi lớp:

$ 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

Họ có một câu trả lời rất hay tại đây: https://stackoverflow.com/a/32455275/165865

Chỉ cần chạy hình ảnh dưới đây:

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

1
Xin chào @bummi, xin lỗi, tôi nghĩ câu hỏi này ban đầu đang tìm kiếm giải pháp trong sổ đăng ký docker và tôi thấy rằng giải pháp mà chúng tôi đã cung cấp ở trên trực tiếp đến các lớp của hình ảnh docker. vì vậy tôi cố gắng bổ sung thêm một giải pháp (mà tôi nghĩ rằng dễ dàng hơn)
sunnycmf

7

Điều này sẽ kiểm tra hình ảnh docker và in các lớp:

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


2
  1. https://hub.docker.com/search?q=* hiển thị tất cả các hình ảnh trong toàn bộ trung tâm Docker, không thể lấy điều này thông qua lệnh tìm kiếm vì nó không chấp nhận ký tự đại diện.

  2. Kể từ v1.10, bạn có thể tìm thấy tất cả các lớp trong một hình ảnh bằng cách kéo nó và sử dụng các lệnh sau:

    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) Kích thước có thể được tìm thấy trong /var/lib/docker/image/aufs/layerdb/sha256/{LAYERID}/sizemặc dù LAYERID! = Diff_ids được tìm thấy với lệnh trước đó. Đối với điều này, bạn cần xem xét /var/lib/docker/image/aufs/layerdb/sha256/{LAYERID}/diffvà so sánh với đầu ra lệnh trước đó để khớp đúng diff_id và kích thước chính xác.


RE1) Không hoạt động đối với tôi dường như chuyển hướng đến hub.docker.com.
joedragons

1
docker kiểm tra tên hình ảnh | jq. []. RootFS.Layers "là cách đơn giản hơn nhiều để thực hiện 2)
wheredidthatnamecome từ

2

Thực sự có thể truy vấn thông tin tệp kê khai hoặc blob từ máy chủ đăng ký docker mà không cần kéo hình ảnh vào đĩa cục bộ.

Bạn có thể tham khảo API đăng ký v2 để tìm nạp tệp kê khai của hình ảnh.

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

Lưu ý, bạn phải xử lý phiên bản tệp kê khai khác nhau. Đối với v2, bạn có thể trực tiếp lấy kích thước của lớp và thông báo của đốm màu. Đối với tệp kê khai v1 , bạn có thể ĐẦU url tải xuống blob để nhận kích thước lớp thực tế.

Có một script đơn giản để xử lý các trường hợp trên sẽ được duy trì liên tục.


0

Không chính xác là câu hỏi ban đầu nhưng để tìm tổng số của tất cả các hình ảnh mà không cần đếm kép các lớp được chia sẻ, phần sau rất hữu ích (ubuntu 18):

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

-4

Tôi đã giải quyết vấn đề này bằng cách sử dụng chức năng tìm kiếm trên trang web của Docker, trong đó '*' là một tìm kiếm hợp lệ trả về kho lưu trữ 200k và sau đó tôi thu thập dữ liệu từng trang bất thường. Phân tích cú pháp HTML cho phép tôi trích xuất tất cả các tên hình ảnh trên mỗi trang.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.