Skip to content
Go to file

Latest commit


Git stats


Failed to load latest commit information.
Latest commit message
Commit time


this is a proof of concept on how we can flatten supplied docker image's data layers into one single layer while trying to retain as much metadata as possible


sudo go run main.go -t newtag existing_image_id

If success, it will generate a new image with newtag tag. For example, if we have an old image with histories:

ID                       CREATED             CREATED BY
docker/flatten:latest    42 minutes ago      /bin/sh -c #(nop) CMD [/bin/sh -c "/bin/echo" "Hello World"]
8e2e9518c2e0             42 minutes ago      /bin/sh -c #(nop) EXPOSE [123 234]
77b2f0a45347             19 hours ago        /bin/sh -c echo "finished"
147b4ee1963f             19 hours ago        /bin/sh -c echo Layer 1 >> layerfile1.txt
a621f6922e55             19 hours ago        /bin/sh -c rm layerfile.txt
192a8f21b35a             19 hours ago        /bin/sh -c apt-get update
9a79eb7d79bb             19 hours ago        /bin/sh -c echo Layer 2 >> layerfile.txt
933fe71d3d56             20 hours ago        /bin/sh -c echo Layer 0 >> layerfile.txt
34c25748f8e8             20 hours ago        /bin/sh -c #(nop) MAINTAINER dqminh ""
ubuntu:12.04             4 months ago

The new generated image's histories will be:

ID                          CREATED             CREATED BY
docker/newflatten:latest    13 minutes ago      /bin/sh -c #(nop) CMD [/bin/sh -c "/bin/echo" "Hello World"]
ceed8ef154f6                13 minutes ago      /bin/sh -c #(nop) EXPOSE [123 234]
0e4a4c56d203                14 minutes ago      /bin/sh -c #(nop) ADD docker-flatten773823896.tar.gz in /
34c25748f8e8                20 hours ago        /bin/sh -c #(nop) MAINTAINER dqminh ""
ubuntu:12.04                4 months ago

How is this being done

  • gather histories of the existing image
  • from the history, gather info for each image layer, except the base layer
  • rsync all data from base layers into a new directory
  • remove whiteouts and supposedly deleted files/directories
  • compress the data into a tarfile
  • prepare a directory with the tarfile and a generated dockerfile with as much metadata as possible
  • create a new image from the generated dockerfile


prototype on how a docker image can be flattened



No releases published
You can’t perform that action at this time.