Docker images consist of layers, a mechanism that will result in lower build time for your containers. A detailed article about how layers work on docker can be found in the below url.
- Each layer is an image itself, just one without a human-assigned tag. They have auto-generated IDs though.
- Each layer stores the changes compared to the image it’s based on.
- An image can consist of a single layer (that’s often the case when the squash command was used).
- Each instruction in a Dockerfile results in a layer. (Except for multi-stage builds, where usually only the layers in the final image are pushed, or when an image is squashed to a single layer).
- Layers are used to avoid transferring redundant information and skip build steps which have not changed (according to the Docker cache).
But what if you want to combine all the layers of an image into one single piece? This is why squash has been created.
How –squash works
Once the build is complete, Docker creates a new image loading the diffs from each layer into a single new layer and references all the parent’s layers. In other words: when squashing, Docker will take all the filesystem layers produced by a build and collapse them into a single new layer.
Build image without squash
docker build . -t test
Build image with squash
docker build . -t test1 --squash
In order to use squash command you will need to have experimental features enabled.
Navigate in docker desktop settings and in Windows (which is what I currently use) you should go on Docker Engine tab and change the experimental value to true.
After that you can run your docker command using —squash
2 thoughts on “Create single image layers with docker squash”
“–squash” option is deprecated. Any alternative?
An alternative option for squash would be to create a multi stage build and copy all the layers in a single final layer. Squash normally works with experimental features.