41

We can search for available image files on the docker website like this:

How can I tell what the download size(s) will be prior to pulling?

docker.io pull [image]
Sepero
  • 1,599

7 Answers7

15

Looking at the API for Docker, Docker Remote API v1.10, it doesn't appear there is any way to get the sizes of the images. Section "2.2 Images" shows the spec for how to query about images.

Example

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

But this query needs to go against an actual Docker instance. Here's an example showing how one could use the above RESTful query:

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

I saw no way to query the public repositories using this particular RESTful call. The only other RESTful method that looked like you could query docker.io's images was via search, GET /images/search, but the API doesn't show any size attributes being returned for this.

References

slm
  • 369,824
  • Thanks for the insights! Hopefully the docker team will start making this info available via docker search – Sepero Jun 03 '14 at 07:20
  • 1
    @Sepero - yes I'm sure over time things such as this will get added. If this A has resolved your Q's please mark it as accepted so other's know your issue's have been resolved too. – slm Jun 03 '14 at 11:16
  • Awesome, exactly what I needed! – Brady Dowling Aug 16 '17 at 17:38
7

This is not a direct answer to your question but I hope it will be helpful nonetheless.

In the disk-usage script in my Docker experiments I use something like this:

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

So you can run, e.g.:

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

Or you can download that script: disk-usage and run e.g. ./disk-usage "ubuntu busybox gcc" to have the disk usage (as reported by du -sh) displayed for those 3 images:

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

Please note that it doesn't show the actual download required for any given image, and it will display the result after downloading the image, but it gives some idea on how bloated is a given image as compared to others.

You can run it on one machine to decide whether you want to download that images on other machines, or to use it at all.

rsp
  • 3,416
  • 3
    Question is specifically asking for image size before "pulling". docker run causes the image to be pulled. – sepehrl Dec 07 '19 at 04:03
6

I know this is an old question but as of today (10/2020), the website now displays this info. If you click on the "Tags" tab it shows you the compressed size right there:

Example for ubuntu on the docker hub https://hub.docker.com/_/ubuntu?tab=tags

enter image description here

yan
  • 161
4

For HTTP API v2, the size is available via the tags resource under size and full_size. Here's an example URL from one of my repo's tags:

https://cloud.docker.com/v2/repositories/deepdriveio/deepdrive/tags/?page_size=25&page=1

crizCraig
  • 143
2
  1. For image on 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. For image on other registry like Microsoft Container Registry. I figure out 3 ways.

    • Use docker manifest inspect to observe the manifest data, which can give you idea on how to gain the compressed size of the image.

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

    To enable docker manifest inspect, edit ~/.docker/config.json file and set experimental to enable.(Reference: docker manifest inspect)

    • Push the image to Docker Hub and you can get the compressed size of the image on Docker Hub website.

    • Use docker save to save image to a .tar file and then compress it a .tar.gz file.

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
  • 121
1

If you really look into the docker code for pull operation, I think your answer is there. If the image of the container is not cached, then during pulling of the image, docker first collects the information about the image from the registry like number of layers, size of each layers etc. etc.

I would refer to read this file.

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

JakeRobb
  • 295
Arif A.
  • 131
0

Getting compressed image size before pull for any registry that serves Image Manifest V2:

  • Uses docker manifest inspect (available by default in recent Docker versions)
  • Parses and sums layer sizes from the manifest using jq
  • Formats sizes to iec standard using numfmt (not si, sizes in manifests are 1024-based)
  • Supports multi-arch manifests
$ dockersize() { docker manifest inspect -v "$1" | jq -c 'if type == "array" then .[] else . end' |  jq -r '[ ( .Descriptor.platform | [ .os, .architecture, .variant, ."os.version" ] | del(..|nulls) | join("/") ), ( [ .SchemaV2Manifest.layers[].size ] | add ) ] | join(" ")' | numfmt --to iec --format '%.2f' --field 2 | sort | column -t ; }

$ dockersize mcr.microsoft.com/dotnet/core/samples:dotnetapp-buster-slim linux/amd64 72.96M

$ dockersize ghcr.io/ddelange/pycuda/runtime:3.9-master linux/amd64 1.84G linux/arm64 1.80G

$ dockersize python linux/amd64 334.98M linux/arm/v5 308.21M linux/arm/v7 295.69M linux/arm64/v8 326.32M linux/386 339.74M linux/mips64le 314.88M linux/ppc64le 343.86M linux/s390x 309.52M windows/amd64/10.0.20348.825 2.20G windows/amd64/10.0.17763.3165 2.54G

  • For Debian users: apt-get install jq
  • For Mac users: brew install coreutils jq (coreutils ships numfmt)
ddelange
  • 101