Подтвердить что ты не робот

Поиск слоев и размеров слоев для каждого изображения Docker

В исследовательских целях я пытаюсь обходить общедоступный реестр Docker (https://registry.hub.docker.com/) и узнать 1) сколько слоев имеет среднее изображение и 2) размеры этих слоев, чтобы получить представление о распределении.

Однако я изучил API и публичные библиотеки, а также подробности о github, но я не могу найти какой-либо метод:

  • получить все общедоступные репозитории/изображения (даже если они являются тысячами, мне по-прежнему нужен стартовый список для итерации)
  • найти все слои изображения
  • найдите размер для слоя (а не изображение, но для отдельного слоя).

Может ли кто-нибудь помочь мне найти способ получить эту информацию?

Спасибо!

EDIT: кто-нибудь может проверить, что поиск "*" в реестре Docker возвращает все репозитории, а не все, что упоминает "*" где угодно? https://registry.hub.docker.com/search?q=*

4b9b3361

Ответ 1

Вы можете найти слои изображений в папке /var/lib/docker/aufs/layers; если вы настроили для хранения-драйвера как 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/layers, и файл cat начинается с идентификатора контейнера (здесь это 0ca502fa6aae *)

 [email protected]:/var/lib/docker/aufs/layers# cat    0ca502fa6aaefc89f690736609b54b2f0fdebfe8452902ca383020e3b0d266f9-init 
 d2a0ecffe6fa4ef3de9646a75cc629bbd9da7eead7f767cb810f9808d6b3ecb6
 29460ac934423a55802fcad24856827050697b4a9f33550bd93c82762fb6db8f
 b670fb0c7ecd3d2c401fbfd1fa4d7a872fbada0a4b8c2516d0be18911c6b25d6
 83e4dde6b9cfddf46b75a07ec8d65ad87a748b98cf27de7d5b3298c1f3455ae4

Это покажет результат того же, запустив

[email protected]:/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 

Чтобы просмотреть идентификатор полного слоя; запускается с параметром --no-trunc как часть команды history.

docker history --no-trunc ubuntu

Ответ 2

Сначала вы можете найти идентификатор изображения:

$ docker images -a

Затем найдите его слои и их размеры:

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

Примечание. Я использую Docker версии 1.13.1

$ docker -v
Docker version 1.13.1, build 092cba3

Ответ 3

На мой взгляд, 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

Ответ 4

Здесь у них очень хороший ответ: fooobar.com/questions/182641/...

Просто запустите следующие изображения:

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

Ответ 5

Это проверит изображение докеров и распечатает слои:

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

Ответ 6

Проверьте погружение написано на Голанге.

Отличный инструмент.

Вы можете настроить исходный код так, чтобы он экспортировал всю отображаемую информацию в файл json.

Ответ 7

  1. https://hub.docker.com/search?q=* показывает все изображения во всем концентраторе Docker, это невозможно получить с помощью команды поиска, так как он не принимает подстановочные знаки.

  2. Начиная с версии 1.1 вы можете найти все слои изображения, потянув его и используя следующие команды:

    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 и размеру.

Ответ 9

Я решил эту проблему, используя функцию поиска на веб-сайте Docker, где "*" - это действительный поиск, который возвращает 200k репозиториев, а затем я просматриваю каждую страницу invididual. Разбор HTML позволяет мне извлекать все имена изображений на каждой странице.