The Dockerfile format is, in my opinion, crap. It’s extremely useful, and it’s fairly straightforward to kludge together a container build process using it, but:
It’s very hard to get reproducible output. It’s even fairly hard to get output where the inputs are well controlled.
It can’t do a clean crossbuild — you have to run the container to build it. As a side effect, you need all the tooling to install things into the container to be in the container. (Yes, there are workarounds. They’re ugly.)
It leaves trash behind. You need to fight with it to even get /tmp to be temporary.
It has no usable efficient way to supply large input files. You can bind-mount into a RUN, but getting permissions right when doing so is an uphill battle.
It’s very hard to get reproducible output. It’s even fairly hard to get output where the inputs are well controlled.
It can’t do a clean crossbuild — you have to run the container to build it. As a side effect, you need all the tooling to install things into the container to be in the container. (Yes, there are workarounds. They’re ugly.)
It leaves trash behind. You need to fight with it to even get /tmp to be temporary.
It has no usable efficient way to supply large input files. You can bind-mount into a RUN, but getting permissions right when doing so is an uphill battle.