> First, the Dockerfile file format for declaratively describing a machine (operating system, installed packages, processes, etc).
The Dockerfile format is not declarative.
Declarative means you define the state you want
Imperative means you define the commands to run
Dockerfile is 100% imperative
If you're going to make absolutist statements about nitpicky minutiae, you have to get it right.
In point of fact the image side of a Dockerfile, where an image is a DAG of other images referenced by an immutable ID or pointer to hosted content, is "100%" declarative. It's only the "build" syntax that is ordered.
The "image side of a Dockerfile" isn't a Dockerfile, it's an image, more specifically an image in the OCI Image Format [0]. A Dockerfile is just the most common syntax for controlling software that can create an OCI image (such as Docker and Podman).
You could argue that the OCI Image Format is declarative, but that's not relevant to OP's comment about Dockerfiles.