Use VMs, Do not use containers if you do not want immutability.
Use this if you need VM-like setup: Issue Installing Apps in Docker Container - #3 by fiveoaks , it uses frappe/bench image. It is what VM will also do with dependencies. Initiating a bench and keeping it in volume is good for you to make it work like VM.
For me proper way of Production setup is CI / CD > Gitops > Kubernetes. Check this diagram Frappe Apps Kubernetes Setup · castlecraft/custom_containers Wiki · GitHub
edit: Immutable images are base for horizontal / dynamic scaling.