What’s in a Docker image?

Tim Burks
1 min readJul 8, 2021

--

A Docker image is a directory hierarchy containing the initial contents of a running container. It is represented by a manifest file which lists its layers, and each layer is a gzipped tarfile (.tgz files). Layers are stored as blobs named by digests of their contents.

As a sanity check, we might want to view the contents of an image that we’ve pushed to DockerHub. Following these instructions, here’s a script that fetches an image using the DockerHub Registry API. It requires jq.

#!/bin/sh# the image that we want to download
export IMAGE="timburks/tiny"
# first we need to get an auth token with the access
# permissions that we need
export AUTHURL="https://auth.docker.io/token?scope=repository:$IMAGE:pull&service=registry.docker.io"
export TOKEN=`curl --silent $AUTHURL | jq -r '.token'`
# next we fetch the manifest and extract the layer digests
export DIGESTS=`curl \
--silent \
--header "Accept: application/vnd.docker.distribution.manifest.v2+json" \
--header "Authorization: Bearer $TOKEN" \
"https://registry-1.docker.io/v2/$IMAGE/manifests/latest" \
| jq -r '.layers[].digest'`
# each digest is the name of a blob containing an image layer
echo $DIGESTS
# we'll put the layers of the image in a directory named 'layers'
# watch out for name collisions!
rm -rf layers
mkdir layers
LAYER=0
for DIGEST in $DIGESTS ; do
echo $DIGEST
curl --silent --location \
--header "Authorization: Bearer $TOKEN" \
https://registry-1.docker.io/v2/$IMAGE/blobs/$DIGEST \
-o layers/layer-$LAYER.tgz
LAYER=$((LAYER+1))
done
# now you can look inside or unpack each image with tar.

--

--

Tim Burks
Tim Burks

Written by Tim Burks

Software developer in the SF Bay area. Electronic Design Automation, iOS apps, and now API tools for the world’s largest computer.

No responses yet