Ansible and Salt don't seem to fit the use case of configuring something that
is effectively a chroot, and I don't know if Chef can be used with chroot-like
installations, but you must have used Puppet in a wrong way if it caused you
trouble (my guess is that you used Puppet with master, not a CFEngine-like
masterless mode).
Actually I translated all the configuration that would be done through RUN commands in a Dockerfile, into Ansible roles and playbooks that are applied at build time.