Re:Optimizing Docker image size and why it matters
by JimDabell on Thursday January 06, 2022 @11:26PM
(#29834826)
That’s useful, thanks.
I’m confused why they haven’t implemented a COMMIT instruction.
It’s so common to have people chain “command && command && command && command” to group things into a single layer. Surely it would be better to put something like “AUTOCOMMIT off” at the start of the Dockerfile and then “COMMIT” whenever you want to explicitly close the current layer. It seems much simpler than everybody hacking around it with shell side-effects.
Re:Optimizing Docker image size and why it matters
by franga2000 on Friday January 07, 2022 @04:02AM
(#29836805)
There's an issue on Github about that and it's been open for about as long as Docker has existed. Looks like they just don't care.
Re:Optimizing Docker image size and why it matters
by bborud on Friday January 07, 2022 @05:16AM
(#29837378)
...or at least some syntax that represents layers like (block) scopes do in a programming language so it is visually easier to see what is going on.
Re:Optimizing Docker image size and why it matters
by imglorp on Thursday January 06, 2022 @04:38PM
(#29830631)
This is huge, thanks for the lead. Others should note it's still experimental and your build command may fail with
> "--squash" is only supported on a Docker daemon with experimental features enabled
Up til now, our biggest improvement was with "FROM SCRATCH".
Re:Optimizing Docker image size and why it matters
by gavinray on Thursday January 06, 2022 @04:42PM
(#29830676)
No problem.
> Others should note it's still experimental and your build command may fail with
You might try "docker buildx build", to use the BuildKit client -- squash isn't experimental in that one I believe =)https://docs.docker.com/engine/reference/commandline/buildx_...
Re:Optimizing Docker image size and why it matters
by selfup on Thursday January 06, 2022 @04:42PM
(#29830668)
Good to know. `FROM scratch` is such a breath of fresh air for compiled apps. No need for Alpine if I just need to run a binary!
Re:Optimizing Docker image size and why it matters
by jrockway on Thursday January 06, 2022 @04:48PM
(#29830745)
Do keep in mind that you might want a set of trusted TLS certificates and the timezone database. Both will be annoying runtime errors when you don't trust https://api.example.com or try to return a time to a user in their preferred time zone. Distroless includes these.
Re:Optimizing Docker image size and why it matters
by selfup on Thursday January 06, 2022 @06:46PM
(#29832393)
Yea CA certs are the first pain point I hit. Worth the hurdle. Noted on the timezone. Never really thought about that one. Thanks!
Re:Optimizing Docker image size and why it matters
by a_t48 on Thursday January 06, 2022 @06:13PM
(#29831966)
Downside - squash makes for longer pulls from the image repository, which can matter for large images or slow connections (you keep build layers but now have no caching for consumers of the image). There's various tricks to be pulled that don't use squash - I've had the most luck putting multiple commands into a buildkit stage, then mounting the results of that stage and copying the output in (either by manually getting the list of files, or using rysnc to figure it out for me).
Re:Optimizing Docker image size and why it matters
by yjftsjthsd-h on Thursday January 06, 2022 @05:15PM
(#29831138)
But then you end up with just one layer, so you lose out on any caching and sharing you might have gotten. Whether this matters is of course very context dependent, but there are times when it'll cost you space.
Re:Optimizing Docker image size and why it matters
by selfup on Thursday January 06, 2022 @04:39PM
(#29830638)
Had no idea about squash. Using cached layers can really save time, especially when you already have OS deps/project deps installed. Thanks!
Re:Optimizing Docker image size and why it matters
by franga2000 on Friday January 07, 2022 @04:17AM
(#29836924)
Doesn't that squash all your layers though? That defeats the whole purpose of there being layers. Now instead of a huge total size, but pushing only a fraction of it, your total is lower but you're pushing all of it every time. Same goes for disk space if you're running multiple instances or many images with shared lineage.
https://docs.docker.com/engine/reference/commandline/build/#...
The downside of trying to jam all of your commands into a gigantic single RUN invocation is that if it isn't correct/you need to troubleshoot it, you can wind up waiting 10-20 minutes between each single line change just waiting for your build to finish.
You lose all the layer caching benefits and it has to re-do the entire build.
Just a heads up for anyone that's not suffered through this before.