Пошук шарів та розмірів шарів для кожного зображення Docker


108

Для дослідницьких цілей я намагаюся просканувати загальнодоступний реєстр Docker ( https://registry.hub.docker.com/ ) і з'ясувати 1) скільки шарів має середнє зображення та 2) розміри цих шарів, щоб отримати ідея розподілу.

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

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

Хтось може допомогти мені знайти спосіб отримати цю інформацію?

Дякую!

РЕДАГУВАТИ: чи може хтось перевірити, що пошук знаку "*" у реєстрі Docker повертає всі сховища, а не просто те, що де-небудь згадує "*"? https://registry.hub.docker.com/search?q=*


7
>>> знайти всі шари зображення, якщо ви не використовуєте API, ви можете зробити a, docker history myimageі ви побачите розмір кожного шару. Більш загально, на зображенні ви можете docker history myimage | awk 'NR>1 {print $1}' | xargs docker inspect --format '{{ ((index .ContainerConfig.Cmd ) 0) }}'побачити, які команди були видані для створення зображення
user2915097

Це вже чудова допомога для кроку 2, хоча для цього потрібно завантажувати кожне зображення через Docker на свою локальну машину. Я припускаю, що це варіант, але лише якщо я знайду спосіб отримати список "моїх зображень", з якого слід почати (наприклад, кожне зображення у публічному реєстрі на кроці 1). Я точно вивчу цей варіант, дякую!
user134589

https://registry.hub.docker.com/search?q=*показує для мене 87031 сховищ,
user2915097

Відповіді:


81

Ви можете знайти шари зображень у папці / var / lib / docker / aufs / шари; укажіть, якщо ви налаштували драйвер зберігання як 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 / шари та встановіть файл, який починається з ідентифікатора контейнера (тут це 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 

Для перегляду повного ідентифікатора шару; запустити з параметром --no-trunc як частина команди історії.

docker history --no-trunc ubuntu

1
Це більше не стосується docker версії 1.10 і далі. docker historyкоманда не надасть шари зображення, як показано в папці / var / lib / docker / aufs / шари. Прочитайте оновлення тут .
Руйфенг Ма

9
Починаючи з версії Docker 1.10, із введенням адресного сховища вмісту, зображення та шари тепер відокремлені. docker historyКоманда більше не повідомляє інформацію про фактичний рівень дискового шару на хості докера. Перегляньте цей щоденник
Ruifeng Ma

52

Спочатку можна знайти ідентифікатор зображення за допомогою:

$ docker images -a

Потім знайдіть шари зображення та їх розміри:

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

Примітка. Я використовую Docker версії 1.13.1

$ docker -v
Docker version 1.13.1, build 092cba3


28

На мій погляд, 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, вибачте, мені здається, це питання спочатку шукає рішення в реєстрі docker, і я знайшов це рішення, яке ми надали вище, безпосередньо до шарів зображення docker. тому я намагаюся доповнити ще одне рішення (яке, на
мою

7

Це перевірить зображення докера і надрукує шари:

$ 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, знайдені за допомогою попередньої команди. Для цього вам потрібно переглянути /var/lib/docker/image/aufs/layerdb/sha256/{LAYERID}/diffта порівняти з попереднім висновком команди, щоб правильно відповідати правильним ідентифікаторам і розмірам.


RE1) Не спрацювало для мене, схоже, перенаправляє на hub.docker.com.
joedragons

1
докер перевірити ім'я зображення | jq. []. RootFS.Layers "- це набагато простіший спосіб зробити 2)
wheredidthatnamecome від

2

Дійсно здійснити запит інформації маніфесту або BLOB-даних із сервера реєстру докерів, не витягуючи зображення на локальний диск.

Ви можете звернутися до API реєстру v2, щоб отримати маніфест зображення.

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

Зауважте, вам доведеться обробляти різні версії маніфесту. Для v2 ви можете безпосередньо отримати розмір шару та дайджест краплі. Для маніфесту v1 ви можете НАГОЛОВАТИ URL-адресу завантаження BLOB-файлу, щоб отримати фактичний розмір шару.

Існує простий сценарій для розгляду вищезазначених справ, який буде постійно підтримуватися.


0

Не зовсім оригінальне питання, але для пошуку загальної суми всіх зображень без подвійного підрахунку спільних шарів корисно наступне (ubuntu 18):

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

-4

Я вирішив цю проблему за допомогою функції пошуку на веб-сайті Docker, де '*' - це дійсний пошук, який повертає 200 тис. Сховищ, а потім я просканував кожну невидиму сторінку. Синтаксичний розбір HTML дозволяє мені витягти всі імена зображень на кожній сторінці.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.