Squash Docker image to remove unnecessary layers in case you do not have a need to keep them.

Install docker-squash.

$ pip install docker-squash

Display help information.

$ docker-squash --help
usage: docker-squash [-h] [-v] [--version] [-d] [-f FROM_LAYER] [-t TAG] [-c] [--tmp-dir TMP_DIR] [--output-path OUTPUT_PATH] image

Docker layer squashing tool

positional arguments:
  image                 Image to be squashed

optional arguments:
  -h, --help            show this help message and exit
  -v, --verbose         Verbose output
  --version             Show version and exit
  -d, --development     Does not clean up after failure for easier debugging
  -f FROM_LAYER, --from-layer FROM_LAYER
                        ID of the layer or image ID or image name. If not specified will squash all layers in the image
  -t TAG, --tag TAG     Specify the tag to be used for the new image. If not specified no tag will be applied
  -c, --cleanup         Remove source image from Docker after squashing
  --tmp-dir TMP_DIR     Temporary directory to be created and used
  --output-path OUTPUT_PATH
                        Path where the image should be stored after squashing. If not provided, image will be loaded into Docker
                        daemon

Inspect our sample DokuWiki image that will be used in this example.

$ docker image ls dokuwiki:latest
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
dokuwiki     latest    81fa953242ea   32 hours ago   51.2MB
$ docker history dokuwiki:latest
IMAGE          CREATED        CREATED BY                                      SIZE      COMMENT
81fa953242ea   32 hours ago   /bin/sh -c #(nop)  CMD ["unitd" "--no-daemon…   0B        
aad5ffa6cd31   32 hours ago   /bin/sh -c #(nop) WORKDIR /opt/dokuwiki         0B        
a98a1806e8ec   32 hours ago   /bin/sh -c #(nop)  USER dokuwiki                0B        
cbe7109019c4   32 hours ago   /bin/sh -c #(nop)  EXPOSE 8080                  0B        
e58156317f72   32 hours ago   |2 GID=5000 UID=5000 /bin/sh -c chown -R dok…   672B      
162700362dc1   32 hours ago   /bin/sh -c #(nop) COPY file:25cd54fde2f41817…   672B      
86190f8bf11d   32 hours ago   /bin/sh -c #(nop) COPY file:c44cf51c56219ee0…   366B      
e675b4d5cd31   32 hours ago   /bin/sh -c #(nop) COPY file:8f17ce87a068c7b4…   172B      
311cba329257   32 hours ago   /bin/sh -c #(nop) COPY file:a18b36cd71c66d32…   327B      
5f266a479729   32 hours ago   /bin/sh -c #(nop) COPY file:47074ff4abd6297f…   228B      
d8239e54107a   32 hours ago   |2 GID=5000 UID=5000 /bin/sh -c apk add --no…   16.9MB    
9bda04b7bdec   32 hours ago   |2 GID=5000 UID=5000 /bin/sh -c apk add --no…   14.3MB    
feb2d2025277   32 hours ago   /bin/sh -c #(nop) COPY dir:fb9054dc9d2ccd9af…   14.3MB    
92a7fd2f9644   32 hours ago   /bin/sh -c #(nop)  LABEL application=Dokuwiki   0B        
02390e6d72a2   32 hours ago   /bin/sh -c #(nop)  LABEL build_date=            0B        
0403cc96ee02   32 hours ago   /bin/sh -c #(nop)  LABEL maintainer=Milosz G…   0B        
ab011b78698c   32 hours ago   /bin/sh -c #(nop)  ARG BUILD_DATE               0B        
b106775f33c9   32 hours ago   /bin/sh -c #(nop)  ARG GID=5000                 0B        
48a608d4aec2   32 hours ago   /bin/sh -c #(nop)  ARG UID=5000                 0B        
14119a10abf4   13 days ago    /bin/sh -c #(nop)  CMD ["/bin/sh"]              0B        
<missing>      13 days ago    /bin/sh -c #(nop) ADD file:aad4290d27580cc1a…   5.6MB 

Squash all layers and tag the new image.

$ docker-squash --tag dokuwiki:squashed dokuwiki:latest
2021-09-10 08:37:47,291 root         INFO     docker-squash version 1.0.8, Docker 75249d8, API 1.41...
2021-09-10 08:37:47,291 root         INFO     Using v2 image format
2021-09-10 08:37:47,297 root         INFO     Old image has 21 layers
2021-09-10 08:37:47,298 root         INFO     Checking if squashing is necessary...
2021-09-10 08:37:47,298 root         INFO     Attempting to squash last 21 layers...
2021-09-10 08:37:47,298 root         INFO     Saving image sha256:81fa953242eac0c98f35d5400e5921be0d83981e0280b37d09fcfbc9145d1a58 to /tmp/docker-squash-6e276eur/old directory...
2021-09-10 08:37:48,160 root         INFO     Image saved!
2021-09-10 08:37:48,161 root         INFO     Squashing image 'dokuwiki:latest'...
2021-09-10 08:37:48,161 root         INFO     Starting squashing...
2021-09-10 08:37:48,161 root         INFO     Squashing file '/tmp/docker-squash-6e276eur/old/70a2035b0eef207d0c40d3b06b3e67f69a97a52b67398b31262a39bbe4b30043/layer.tar'...
2021-09-10 08:37:48,163 root         INFO     Squashing file '/tmp/docker-squash-6e276eur/old/eabb7e8485249875a46a6e310a0a8efaae9481b0749648c33167d7378df9ad62/layer.tar'...
2021-09-10 08:37:48,163 root         INFO     Squashing file '/tmp/docker-squash-6e276eur/old/13e58f6558c933cab47f2453763a86db042fe1fe39091d5da303f46abfbe1818/layer.tar'...
2021-09-10 08:37:48,164 root         INFO     Squashing file '/tmp/docker-squash-6e276eur/old/cfebac32493419e94a16ae0980c5319bcf6b1279c26d095017ee38b6dbad9cd9/layer.tar'...
2021-09-10 08:37:48,164 root         INFO     Squashing file '/tmp/docker-squash-6e276eur/old/e23937289f7323fbbd4c0d3a49a83e07caa1e19ab87e0a9cc601b6095767ae39/layer.tar'...
2021-09-10 08:37:48,165 root         INFO     Squashing file '/tmp/docker-squash-6e276eur/old/d67fd73b1b4dabf8e354855661bdfd111e8db71d197750cbc57c4f6a8ee3b161/layer.tar'...
2021-09-10 08:37:48,165 root         INFO     Squashing file '/tmp/docker-squash-6e276eur/old/3bb511c620d893a55d29914ca10e0d2b00a7fac7914d4fcf6353f37c440d421a/layer.tar'...
2021-09-10 08:37:48,225 root         INFO     Squashing file '/tmp/docker-squash-6e276eur/old/eeb4ab19d86bc7fdaf6959f899da2d8d4a0c1570e8dd062b22a503344cb61e2c/layer.tar'...
2021-09-10 08:37:49,086 root         INFO     Squashing file '/tmp/docker-squash-6e276eur/old/1951918a94180fd1570e050a251a4a4e61883fb8e7d35cdd2c62aa0a6bf35f9b/layer.tar'...
2021-09-10 08:37:49,456 root         INFO     Squashing file '/tmp/docker-squash-6e276eur/old/5dee72d2797c533813effb8e9de26377300d29f418ebb06bfe814f950a7aa02b/layer.tar'...
2021-09-10 08:37:49,571 root         INFO     Squashing finished!
2021-09-10 08:37:49,702 root         INFO     Original image size: 57.36 MB
2021-09-10 08:37:49,702 root         INFO     Squashed image size: 39.64 MB
2021-09-10 08:37:49,702 root         INFO     Image size decreased by 30.88 %
2021-09-10 08:37:49,702 root         INFO     New squashed image ID is 3f89c7a43637b1c3e60186252371d6d653ddbcfb03b3c648adde8942050a9c50
2021-09-10 08:37:49,816 root         INFO     Image registered in Docker daemon as dokuwiki:squashed
2021-09-10 08:37:49,823 root         INFO     Done

Inspect squashed image.

$ docker image ls dokuwiki:squashed
REPOSITORY   TAG        IMAGE ID       CREATED          SIZE
dokuwiki     squashed   3f89c7a43637   18 seconds ago   36.8MB
$ docker history dokuwiki:squashed
IMAGE          CREATED          CREATED BY   SIZE      COMMENT
3f89c7a43637   31 seconds ago                36.8MB    

Additional notes

Check out docker-squash source code.