Jak określić rozmiar obrazu Dockera przed wyciągnięciem?

35

Możemy wyszukać dostępne pliki obrazów w witrynie dokera w następujący sposób:

Jak mogę określić rozmiar (rozmiary) pobierania przed pobraniem?

docker.io pull [image]
Sepero
źródło
1
Nie jest to ogólna odpowiedź, ale patrząc na sposób, w jaki budowane są obrazy ubuntu typu stackbrew , możesz odgadnąć dolną granicę rozmiaru obrazu na podstawie używanych plików tar . (Aby uzyskać przewidywalne wykorzystanie przepustowości, możesz po prostu zbudować obrazy samodzielnie - wtedy będziesz wiedział, ile jest pobierane, tj. Sam plik tarball.)
sr_

Odpowiedzi:

14

Patrząc na API dla Docker, Docker Remote API v1.10 , nie wydaje się, że jest jakiś sposób na uzyskanie rozmiarów obrazów. Sekcja „2.2 Obrazy” pokazuje specyfikację dotyczącą zapytań o obrazy.

Przykład

    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
      }
    ]

Ale to zapytanie musi być zgodne z rzeczywistą instancją Dockera. Oto przykład pokazujący, jak można użyć powyższego zapytania 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}]

Nie widziałem sposobu na zapytanie publicznych repozytoriów przy użyciu tego konkretnego wywołania RESTful. Jedyną inną metodą RESTful, która wyglądała, jakbyś mógł zapytać o obrazy docker.io, była wyszukiwarka GET /images/search, ale API nie pokazuje żadnych zwracanych atrybutów rozmiaru.

Referencje

slm
źródło
Dzięki za wgląd! Mamy nadzieję, że zespół dokerów zacznie udostępniać te informacje za pośrednictwemdocker search
Sepero
@ Stepero - tak, jestem pewien, że z czasem takie rzeczy zostaną dodane. Jeśli to A rozwiązało twoje Q, oznacz je jako zaakceptowane, aby inni wiedzieli, że twój problem również został rozwiązany.
slm
Niesamowite, dokładnie to, czego potrzebowałem!
Brady Dowling
7

To nie jest bezpośrednia odpowiedź na twoje pytanie, ale mam nadzieję, że mimo wszystko będzie pomocna.

W skrypcie użycia dysku w moich eksperymentach Dockera używam czegoś takiego:

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

Możesz więc uruchomić np .:

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

Możesz też pobrać ten skrypt: użycie dysku i uruchomić np. ./disk-usage "ubuntu busybox gcc"Aby wyświetlić użycie dysku (zgodnie z raportem du -sh) dla tych 3 obrazów:

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

Pamiętaj, że nie pokazuje rzeczywistego pobierania wymaganego dla danego obrazu i wyświetli wynik po pobraniu obrazu, ale daje pewne wyobrażenie o tym, jak rozdęty jest dany obraz w porównaniu do innych.

Możesz uruchomić go na jednym komputerze, aby zdecydować, czy chcesz pobrać te obrazy na inne komputery, czy w ogóle go użyć.

rsp
źródło
1

Jeśli naprawdę przyjrzysz się kodowi dokowanemu dla operacji ściągania, myślę, że twoja odpowiedź tam jest. Jeśli obraz kontenera nie jest buforowany, to podczas pobierania obrazu dokerka najpierw zbiera informacje o obrazie z rejestru, takie jak liczba warstw, rozmiar każdej warstwy itp.

Odsyłam do przeczytania tego pliku.

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

Arif A.
źródło
1
  1. Dla obrazu w 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. Obraz w innym rejestrze, takim jak Microsoft Container Registry. Wymyślam 3 sposoby.

    • Użyj, docker manifest inspectaby obserwować dane manifestu, które mogą dać ci wyobrażenie o tym, jak uzyskać skompresowany rozmiar obrazu.

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

    Aby włączyć docker manifest inspect, edytuj ~/.docker/config.jsonplik i ustaw experimentalna enable. (Odwołanie: manifest manifestu dokera )

    • Wepchnij obraz do Docker Hub, a możesz uzyskać skompresowany rozmiar obrazu na stronie Docker Hub.

    • Użyj, docker saveaby zapisać obraz do pliku .tar, a następnie skompresuj go do pliku .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
Di Lin
źródło