5 ms·
While developing an image, I use layers as much as possible. But usually, when the image is finished, I prefer to minimize the number of layers, it saves some (
by chung1905 7y ago
While developing an image, I use layers as much as possible.
But usually, when the image is finished, I prefer to minimize the number of layers, it saves some (or little) storage (I think it will not > 10%).
- londons_explore 7y agoFewer layers also performs better in the final image. Things like listing a directory get very slow with thousands of layers.
- Leace 7y agoI suggest reading about multi-stage builds. They basically squash layers at the end so it's a "have cake and eat it too" scenario. This pattern of concatenating commands to have a minimal image is a workaround from times when multi-stage builds were not available.
- annymsMthd 7y agoMultistage builds do not squash at the end.
- chatmasta 7y agoYou can do this with experimental flags [0] and --squash [1] [2] [0] https://github.com/moby/buildkit/blob/master/frontend/dockerfile/docs/experimental.md https://github.com/moby/buildkit/blob/master/frontend/docker... [1] https://geraldonit.com/2017/11/13/how-to-create-small-docker-images/ https://geraldonit.com/2017/11/13/how-to-create-small-docker... [2] https://docs.docker.com/engine/reference/commandline/image_build/ https://docs.docker.com/engine/reference/commandline/image_b...
- pm7 7y ago@Leace > I suggest reading about multi-stage builds. They basically squash layers at the end so it's a "have cake and eat it too" scenario. That's completely different thing. Multi-stage builds are great for separating build environment from production environment, but if you need several layers for production environment, they won't be squashed. See here: https://github.com/docker/compose/issues/4235#issuecomment-324926856 https://github.com/docker/compose/issues/4235#issuecomment-3...
- mnutt 7y agoYeah, I suspect that while the author could use a development image to do all of the compiling, given that all of the nginx files are not in a single directory it's my understanding that you'd need multiple COPY commands, and you'd still want to do all of the package manager operations in the prod build. It's really a tradeoff of development ease vs minimal packaged output.
- pm7 7y ago> given that all of the nginx files are not in a single directory it's my understanding that you'd need multiple COPY commands Workaround would be to move these files to one directory on host, COPY it in one command to /tmp (or even better, /dev/shm or other ramdisk) and then use script to distribute files where needed.
- chatmasta 7y agoYou can make the multi-stage builds actual images themselves, and setup your CI to auto push them to a registry. Then you can have shared multistage builds, which is pretty useful for things like compiling static libraries in their own images, and COPYing them into images that statically link to them.