Determine the size of Docker image layers
Let’s quickly recap what Docker layers are before we look at how to query their size. No worries, we look at the tip of the iceberg.
What are Docker layers๐
Every Docker image consists of layers. A single layer is the result of a particular instruction someone wrote down in a Dockerfile. Docker ads a new layer to the stack for each instruction of the Dockerfile. All layers together build the final Docker image.
Every layer is represented and treated by a hash. Docker computes the hash of a layer based on different contextual information such as the modifications and the parent layer chain. (Get all nitty-gritty details about layer ids).
Inspect the size of an image๐
If you have ever worked with Docker, the chances are good that you have looked at the list of images on your system. The docker image ls command not only lists image identifiers and names. Additionally, it shows the actual size of the entire image.
# list all local images
docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest f643c72bc252 2 weeks ago 72.9MB
If you don’t have any image on your local machine, go ahead and pull an image of your choice from Docker Hub. For example, pull the official Ubuntu image by executing docker pull ubuntu:latest. Now you should also see the size of the image when running docker image ls.
However, knowing the size of the entire image is sometimes not enough.
Get the size of Docker image layers๐
Sometimes, you want to dive deeper. Or you have to investigate or troubleshoot to understand why an image has a specific size. Inspecting the layers of an image is helpful in these situations.
Just execute docker history ubuntu:latest to get a list containing all layers and their size:
# inspect the layers of a Docker image
docker history ubuntu:latest
IMAGE CREATED CREATED BY SIZE
f643c72bc252 2 weeks ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 2 weeks ago /bin/sh -c mkdir -p /run/systemd && echo 'doโฆ 7B
<missing> 2 weeks ago /bin/sh -c [ -z "$(apt-get indextargets)" ] 0B
<missing> 2 weeks ago /bin/sh -c set -xe && echo '#!/bin/sh' > /โฆ 811B
<missing> 2 weeks ago /bin/sh -c #(nop) ADD file:4f15c4475fbafb3feโฆ 72.9MB
You can also append the -no-trunc option to docker history to prevent Docker CLI from truncating the output.
# show layers of an image without output truncation
docker history --no-trunc ubuntu:latest
Conclusion๐
Quickly identifying big layers of your Docker image is quite handy when working with new programming languages and frameworks to see if overall Docker image size and pull/push performance can be optimized.