Поиск слоев и размеров слоев для каждого изображения Docker
В исследовательских целях я пытаюсь обходить общедоступный реестр Docker (https://registry.hub.docker.com/) и узнать 1) сколько слоев имеет среднее изображение и 2) размеры этих слоев, чтобы получить представление о распределении.
Однако я изучил API и публичные библиотеки, а также подробности о github, но я не могу найти какой-либо метод:
- получить все общедоступные репозитории/изображения (даже если они являются тысячами, мне по-прежнему нужен стартовый список для итерации)
- найти все слои изображения
- найдите размер для слоя (а не изображение, но для отдельного слоя).
Может ли кто-нибудь помочь мне найти способ получить эту информацию?
Спасибо!
EDIT: кто-нибудь может проверить, что поиск "*" в реестре Docker возвращает все репозитории, а не все, что упоминает "*" где угодно? https://registry.hub.docker.com/search?q=*
Ответы
Ответ 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
-
https://hub.docker.com/search?q=* показывает все изображения во всем концентраторе Docker, это невозможно получить с помощью команды поиска, так как он не принимает подстановочные знаки.
-
Начиная с версии 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 и размеру.
Ответ 8
еще один инструмент: https://github.com/CenturyLinkLabs/dockerfile-from-image
GUI с помощью ImageLayers.io
Ответ 9
Я решил эту проблему, используя функцию поиска на веб-сайте Docker, где "*" - это действительный поиск, который возвращает 200k репозиториев, а затем я просматриваю каждую страницу invididual. Разбор HTML позволяет мне извлекать все имена изображений на каждой странице.