In practice, I find that docker repeats intermediate run steps every time you run docker build.
Which makes sense to me, because you have no idea if an arbitrary shell command is deterministic or not.
Which makes sense to me, because you have no idea if an arbitrary shell command is deterministic or not.
So a good way to optimize your Dockerfile is to put commands in an order like:
* dependencies, e.g. apt-get, useradd...
* containers configs PORT, ENV, USER from less likely to change to more likely to change
* ADD commands
* final RUN commands to setup your image