Stop fighting the base image and start layering your own bits with bootc
Technical Briefing | 10/18/2026
For years we have been building servers by layering configuration management on top of a base install. You run your Ansible playbooks, hope the package repo has what you need, and pray that the package dependencies don’t drift between nodes. It is fragile. If a node loses connection halfway through a run, you end up with a Franken-server that is neither clean nor reliable. Moving to bootc changes the paradigm by treating your entire OS as a container image that gets pulled and booted.
Why your immutable OS build is likely failing you
The biggest trap I see with immutable systems is trying to replicate imperative workflows inside the image build. If you are just running yum install inside a Dockerfile to create your base OS, you are missing the point. You are still dealing with transient state and potential conflicts during the build. bootc allows you to define a declarative target and swap it out atomically. When it works, it is brilliant. When the registry goes down, your rollout stops cold. You need to account for local caching or a robust mirror strategy before you bet your production stack on this.
bootc switch quay.io/your-registry/your-custom-os:latest
- Avoid adding heavy runtime dependencies that belong in a container, not the host
- Test your image updates in a staging VM before hitting your fleet
- Ensure your cloud-init handles the identity injection separately from the image itself
The real power here is not just having a clean boot, but having a path back. If you deploy an update that breaks your storage stack or networking, rolling back is just a matter of pointing the boot loader back to the previous snapshot. It is essentially an atomic filesystem swap for your entire machine. Once you stop managing packages at runtime and start managing images at deployment, you will wonder why we spent so much time debugging apt cache locks.
Keep your image slim, keep your config files handled by ignition or cloud-init, and for the love of everything, don’t ship secrets in your build. If you find yourself needing to patch an image after it is running, you have already lost the thread. Build it again, push it, and let the orchestration do its job.
