Skip to content

Image Mode (bootc)

RHEL Image Mode, GA since RHEL 9.6 and built into RHEL 10, is a new way to deliver the operating system: pack the entire OS (kernel, packages, configuration) into a single OCI container image, then build, distribute, and update it with the container toolchain. The core component is bootc (bootable containers). Nothing underneath changes — packages, kernel, and systemd are the same as traditional RHEL. What changes is the delivery model.

The pain points of traditional RHEL operations:

  • Applications go into containers, but the OS itself is still configured layer by layer with RPM plus Ansible — two artifacts, two pipelines
  • System state “drifts”, hard to reproduce, with rollback depending on backups
  • Debugging differences between development, testing, and production is expensive

Image Mode’s answer:

  • One artifact: applications and the OS live in the same container image, distributed from the same registry
  • Immutable base, declarative updates: the system is defined by the image; updating means pulling a new image, and rollback is built in
  • Familiar tools: build with a Containerfile plus Podman/Buildah — no new DSL to learn
ConceptWhat It Is
rhel-bootcRed Hat’s official bootable base image (registry.redhat.io/rhel10/rhel-bootc)
bootcTooling to install, boot, and update image-based systems (bootc upgrade, bootc status on the host)
ContainerfileSame as ordinary container builds, but the output is a bootable image
bootc-image-builderConverts bootc images into ISO, qcow2, AMI, and other installation media
Containerfile: layer custom configuration onto the base image
FROM registry.redhat.io/rhel10/rhel-bootc:latest
# Identical to ordinary image builds: install packages, copy config
RUN dnf -y install nginx && dnf clean all
COPY nginx.conf /etc/nginx/nginx.conf
COPY app.conf /etc/sysctl.d/
# Declare boot-time services with systemd units
RUN systemctl enable nginx.service
Terminal window
$ podman build -t quay.io/yourorg/rhel-custom:1.0 .
$ podman push quay.io/yourorg/rhel-custom:1.0

Two routes:

  • Physical machines / existing systems: run bootc install to-disk, or on a running bootc system bootc switch to your image
  • Cloud/VM images: generate qcow2, AMI, or ISO with bootc-image-builder
Build a qcow2 cloud image with bootc-image-builder
$ podman run \
--rm -it --privileged \
--volume ./output:/output \
quay.io/centos-bootc/bootc-image-builder:latest \
quay.io/yourorg/rhel-custom:1.0 --type qcow2

On a running bootc system:

Check and apply system updates (pull the new image version)
$ sudo bootc upgrade
$ sudo systemctl reboot
# Roll back to the previous image when something breaks
$ sudo bootc rollback

Updates run automatically on a systemd timer — think of it as “a yum update driven by git”.

DimensionTraditional RHEL (RPM + Kickstart)Image Mode (bootc)
System definitionPackage list + config management toolOne container image tag
Updatesdnf upgradebootc upgrade (pull image)
RollbackDepends on snapshots/backupsBuilt-in previous-boot rollback
Build outputISO + Ansible playbookOCI image
Package changesdnf install anytimeChange the image and republish (host still supports dnf for emergencies)

Good fit:

  • Large, standardized server fleets (edge, cloud, CI runners)
  • Compliance scenarios that want “system version = image tag” auditability
  • Teams already running GitOps/container pipelines who want the OS in the same pipeline

Not yet a fit:

  • Single, constantly changing experimental boxes (package-level flexibility wins)
  • Setups relying on third-party kernel modules or frequent hardware changes (verify first)
  • Small environments with no container toolchain — Image Builder and Kickstart deliver more direct value there
  • Image Builder — The traditional image customization route
  • Kickstart — The standard non-image automated installation
  • Podman — The foundation Image Mode builds on
  • FIPS Mode — Declaring compliance baselines inside your image