Пошук шарів та розмірів шарів для кожного зображення 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.