Як визначити розмір зображення Docker перед тим, як витягнути?


35

Ми можемо шукати доступні файли зображень на веб-сайті докера так:

Як я можу сказати, який розмір (и) для завантаження будуть перед витягненням?

docker.io pull [image]

1
Це не загальна відповідь, але, дивлячись на те, як побудовані зображення стаббрю ubuntu , ви можете вгадати нижню межу розміру зображення з використаних тарболів . (Для передбачуваного використання пропускної здатності ви можете просто створити зображення самі - тоді б ви знали, скільки завантажується, тобто просто сам
тарбол

Відповіді:


14

Дивлячись на API для Docker, Docker Remote API v1.10 , він не з'являється, є якийсь спосіб отримати розміри зображень. Розділ "2.2 зображення" показує специфікацію запитів про зображення.

Приклад

    GET /images/json?all=0 HTTP/1.1

**Example response**:

    HTTP/1.1 200 OK
    Content-Type: application/json

    [
      {
         "RepoTags": [
           "ubuntu:12.04",
           "ubuntu:precise",
           "ubuntu:latest"
         ],
         "Id": "8dbd9e392a964056420e5d58ca5cc376ef18e2de93b5cc90e868a1bbc8318c1c",
         "Created": 1365714795,
         "Size": 131506275,
         "VirtualSize": 131506275
      },
      {
         "RepoTags": [
           "ubuntu:12.10",
           "ubuntu:quantal"
         ],
         "ParentId": "27cf784147099545",
         "Id": "b750fe79269d2ec9a3c593ef05b4332b1d1a02a62b4accb2c21d589ff2f5f2dc",
         "Created": 1364102658,
         "Size": 24653,
         "VirtualSize": 180116135
      }
    ]

Але цей запит повинен відповідати фактичному екземпляру Docker. Ось приклад, який показує, як можна використовувати вищезазначений запит RESTful:

$ echo -e "GET /images/json HTTP/1.0\r\n" | nc -U /var/run/docker.sock
HTTP/1.0 200 OK
Content-Type: application/json
Content-Length: 858
Connection: close
Date: Fri, 20 Dec 2013 16:02:41 GMT

[{"Repository":"ubuntu","Tag":"12.04","Id":"8dbd9e392...",
"Created":1365714795,"Size":131502179,"VirtualSize":131502179},
{"Repository":"ubuntu","Tag":"latest","Id":"8dbd9e392...",
"Created":1365714795,"Size":131502179,"VirtualSize":131502179},
{"Repository":"ubuntu","Tag":"precise","Id":"8dbd9e392...",
"Created":1365714795,"Size":131502179,"VirtualSize":131502179},
{"Repository":"ubuntu","Tag":"12.10","Id":"b750fe792...",
"Created":1364102658,"Size":24653,"VirtualSize":180116135},
{"Repository":"ubuntu","Tag":"quantal","Id":"b750fe792...",
"Created":1364102658,"Size":24653,"VirtualSize":180116135}]

Я не бачив можливості запитувати загальнодоступні сховища за допомогою цього конкретного RESTful виклику. Єдиний інший метод RESTful, схожий на те, що ви можете запитувати зображення docker.io, - це пошук GET /images/search, але API не показує атрибутів розміру, які повертаються для цього.

Список літератури


Дякую за розуміння! Сподіваємось, докерська команда почне оприлюднювати цю інформацію черезdocker search
Сеперо

@ Sepero - так, я впевнений, що з часом такі речі, як ця, будуть додані. Якщо цей A вирішив ваш Q, будь ласка, позначте його як прийняте, щоб інші знали, що ваша проблема також була вирішена.
slm

Дивовижне, саме те, що мені було потрібно!
Брейді Даулінг

7

Це не пряма відповідь на ваше запитання, але я сподіваюся, що все-таки це буде корисно.

У сценарії використання диска в моїх експериментах Докер я використовую щось подібне:

docker run --entrypoint=/bin/sh $image -c 'du -sh / 2>/dev/null | cut -f1'

Отже, ви можете запустити, наприклад:

docker run --entrypoint=/bin/sh ubuntu -c 'du -sh / 2>/dev/null | cut -f1'

Або ви можете завантажити цей скрипт: використання диска та запустіть, наприклад, ./disk-usage "ubuntu busybox gcc"щоб використання диска (як повідомляється du -sh) відображалося для цих 3 зображень:

Image   Disk usage
-----   ----------
ubuntu  209M
busybox 2.6M
gcc     1.5G

Зверніть увагу, що на ньому не відображається фактичне завантаження, потрібне для будь-якого зображення, і він відображатиме результат після завантаження зображення, але він дає деяке уявлення про те, наскільки роздутим є дане зображення порівняно з іншими.

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



1

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

Я б посилався читати цей файл.

https://github.com/moxiegirl/docker/blob/master/distribution/xfer/download.go


1
  1. Для зображення на Docker Hub:
curl -s -H "Authorization: JWT " "https://hub.docker.com/v2/repositories/library/<image-name>/tags/?page_size=100" | jq -r '.results[] | select(.name == "<tag-name>") | .images[0].size' | numfmt --to=iec-i
  1. Для зображення в іншому реєстрі, наприклад, Microsoft Container Registry. Я з'ясував 3 способи.

    • Використовуйте docker manifest inspectдля спостереження за маніфестними даними, які можуть дати вам уявлення про те, як отримати стислий розмір зображення.

    docker manifest inspect -v <registry-domain>/<image-name> | grep size | awk -F ':' '{sum+=$NF} END {print sum}' | numfmt --to=iec-i
    

    Щоб увімкнути docker manifest inspect, відредагуйте ~/.docker/config.jsonфайл та встановіть experimentalйого enable. (Довідка: маніфест докера перевірити )

    • Натисніть зображення на Docker Hub, і ви зможете отримати стислий розмір зображення на веб-сайті Docker Hub.

    • Використовуйте docker saveдля збереження зображення у файлі .tar, а потім стисніть його на .tar.gz файл.

docker save my-image:latest > my-image.tar

# Compress the .tar file
gzip my-image.tar

# Check the size of the compressed image
ls -lh my-image.tar.gz
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.