This is meant as a non-exhaustive set of tips to writing clean, usable Dockerfiles.
It's assumed you're at least a little familiar with Docker's best practices document, especially using multi-stage builds. This is meant not to replace, but augment. I will reiterate some of these points to point out particularly useful or powerful conventions.