Buildah is a tool focused on one job: building OCI-standard container images, without a daemon and without requiring root. It builds from a Dockerfile like Docker does, but it also exposes each build step as a scriptable command, giving fine-grained control over how an image is assembled. It's part of the Red Hat container toolchain and a natural companion to Podman, which runs the images Buildah builds.
Two ways to build
Buildah can consume a standard Dockerfile, so existing builds work unchanged:
buildah bud -t myimage . # "build-using-dockerfile"
Or you script the build imperatively, mounting the working container's filesystem and manipulating it directly - useful for assembling minimal images or doing things a Dockerfile can't express cleanly:
ctr=$(buildah from python:3.12-slim)
buildah copy $ctr job.py /app/job.py
buildah config --cmd "python /app/job.py" $ctr
buildah commit $ctr myimage
Why daemonless, rootless builds matter
Docker's traditional build needs a root daemon, which is a problem in CI runners and Kubernetes where you don't want a privileged background process. Buildah builds as an unprivileged user with no daemon, so it slots into pipelines and locked-down environments safely. The images it produces are OCI-standard and run on any runtime.
Buildah vs Kaniko vs Docker build
All three build images; the difference is the environment. Docker build is the default for local dev but wants the daemon. Buildah targets rootless/daemonless builds on a host or in CI, especially in the Red Hat ecosystem. Kaniko is purpose-built to run the build inside a Kubernetes pod. If your builds run on a Linux host or CI runner, Buildah fits; if they run as a step inside a cluster, Kaniko is the common choice.
Where it fits
- CI pipelines that build images without a privileged daemon.
- Producing minimal, precisely-controlled images via scripted builds.
- Red Hat / Podman-based toolchains where Buildah is the native build tool.