Ostree Native Container (Phase 2, stable)
Summary
Continue the work done in https://fedoraproject.org/wiki/Changes/OstreeNativeContainer but in an officially stable format, and expanded to cover more OSTree-based editions. This goes "all in" on being container-native and significantly changes the technology and user emphasis.
Owner
- Name: Colin Walters, Joseph Marrero, Brent Baude
- Email: walters@verbum.org, jmarrero@fedoraproject.org, baude@fedoraproject.org
Current status
- Targeted release: Fedora Linux NN
- Last updated: 2024-09-18
- devel thread
- FESCo issue: #2883
- Tracker bug: #2151321
- Release notes tracker: #933
Detailed Description
- rpm-ostree's functionality to boot and upgrade from Docker/OCI container images is declared stable
- Introduce bootc as a fresh new interface solely dedicated to this
- Rework Fedora editions and spins (CoreOS, IoT, Silverblue, Kinoite, etc) that use ostree to instead deliver via Docker/OCI container images
rpm-ostree
is reworked to gain strong CLI compatibility withyum/dnf
commands (cliwrap)- The new container native functionality is exposed via
bootc
(anddnf image
) - (TBD: Rebranding of rpm-ostree itself to
dnf-image
or something else) - Support and documentation for generating derived images
- Support in Anaconda and other tools
- Support for generating bootable images
A top level goal is that users should not need to know or understand ostree (or rpm-ostree); they only need to know containers and most key functionality is exposed via the yum/dnf
frontend with a few extensions.
Backwards compatibility
If you're a user of ostree today: no need to worry. Everything that works today in ostree and rpm-ostree will continue to work for years to come (it's shipped in RHEL9). However, it's expected that most users will find the new model sufficiently compelling to switch fairly quickly.
Stable Bootable OCI
More information about this is available in the rpm-ostree documentation. This Change highlights that this functionality is planned to be officially stable.
Changing to OCI over the wire
Today Fedora has an OSTree repository that contains updates for editions such as Fedora CoreOS and Fedora Silverblue.
These editions instead will become OCI base images, available at e.g.
quay.io/fedora/fedora-coreos:stable
(this exists today!)quay.io/fedora/fedora-silverblue:38
(does not exist, but can soon)
An update will be shipped that will cause existing systems tracking the production ostree branches to be switched to the corresponding container image. Concretely for example, a system running fedora:fedora/36/x86_64/silverblue
will execute rpm-ostree rebase ostree-remote-registry:fedora:quay.io/fedora/fedora-silverblue:36
.
Note that at the current time, Fedora does not sign container images. This should change (likely to something based on cosign), but in the mean time, the ostree-container flow supports verifying the embedded ostree-baesd GPG signatures and this will continue to be used.
The Fedora OSTree repository will become read-only and stop receiving updates.
Note that for Fedora CoreOS specifically, there is some outstanding design discussion around the intersection with Cincinnati: https://github.com/coreos/fedora-coreos-tracker/issues/1263
Wire efficiency
Today the container images generated by rpm-ostree are "chunked" in a reproducible fashion; for more information on this, see
However, longer term (as that first issue notes) we do want to add container deltas. Doing so will benefit non-host containers too.
bootc
bootc is a new project which provides a fresh new CLI (and soon, API) dedicated to managing bootable container images. It does not depend on RPM (or policykit, etc.) and can be used on dedicated image-based systems.
rpm-ostree dnf/yum CLI compatibility
rpm-ostree has a feature called cliwrap today. A key motivation here is that in the switch to using containers as the frontend, the project name "rpm-ostree" (which is very literal) no longer makes sense. A further emphasis on "container native" will strongly encourage writing e.g. a Dockerfile
like this:
FROM quay.io/fedora/fedora-silverblue:stable RUN dnf -y install sway && ostree container commit
- Today*, one can spell this as
RUN rpm-ostree install -y sway && ostree container commit
- but a toplevel goal here is to allow host system customization using the same patterns and tools one uses to build application containers, and to de-emphasize the "ostree backend" aspect.
To complete this story on the client side, what is today called "ostree native containers" will be exposed via a new dnf image
subcommand on the client system.
For example:
$ dnf image rebase quay.io/examplecorp/customos:latest
As well as other offline/"image based" functionality such as dnf image rollback
and dnf image apply-live
.
However, as many people know, rpm-ostree does today support "per-machine" package layering/overrides - and *that will continue to work*. So users are not *required* to do builds on a remote server even in "image mode".
Concretely, it will also work to sudo dnf -y install sway
inside a root terminal on a Fedora Workstation for example. This will still be a transactional operation.
More: https://github.com/coreos/rpm-ostree/issues/2883
Rebranding of rpm-ostree
This is a fundamental change in technology *and* positioning for rpm-ostree (and for the projects that use it). The terminology of "immutable" gets even fuzzier now (see also this blog).
It would make sense to rebrand the project due to this. No decision has been made on this, but the choices are:
- Keep as is
- Rebrand to dnf-image (or, reviving a past name, yum-image)
- Rebrand to something else
More: https://github.com/coreos/rpm-ostree/issues/405
Support for building derivative containers
Until now, the model for systems like Fedora CoreOS and Silverblue etc. has included an emphasis on containerization, but avoiding extensive customization of the host system. This will be weakened somewhat - it will be fully supported to build derivative operating system images that in turn contain software which itself should run directly on the host system, and not in a container.
A key aspect of this is that by generating a custom build, one binds together the code and configuration as a transactionally updatable unit.
The role of things like Kickstart, cloud-init, and Ignition and other system config management shrinks significantly.
Example 1: Kubernetes and kubelet
It is not supported upstream to run the kubelet in a container image itself. Today, for OpenShift 4 we embed the kubelet as part of the CoreOS builds. The OKD project already installs kubelet during a container build deriving from the base fedora-coreos
image. It is possible that RHEL CoreOS will make a similar split.
Example 2: Agent software
Many organizations require agents (cloud agents, security scanners, antivirus) which are not ready to be containerized. Often too, these tools come in e.g. RPM form, and also expect to be configured (remote logging server, etc.). This tooling allows to dnf install
these *and* embed the configuration, generating a standard container image which can then be booted as an atomic unit.
(Note that in the OpenShift context, we expect this to chain with the first example - users instead derive from a okd-node-base
image which itself derives from fedora-coreos
).
Example 3: Podman machine
The Podman
project has a function called machine
where it creates a virtual machine and boots standard CoreOS builds. Podman developers and users has long desired a custom FCOS image that is focused on container deployment using Podman, including certain QEMU packages that allow for cross-architecture development. This approach will solve a series of problems including but not limited to getting more timely release alignment between Podman and FCOS.
We also have a user base that wants to customize the VM image based on restrictive environments ... bring your own virtual machine image.
Support in Anaconda and other tools
Anaconda support for custom images is tracked in this bug: https://bugzilla.redhat.com/show_bug.cgi?id=2125655
But, as part of this Change, it should also work to generate an Anaconda ISO which allows *user choice* for whether to install in "image mode" or "traditional".
Support for generating bootable images
Instead of using an existing disk image/ISO (Anaconda, AWS AMI, etc.) and then doing an in-place update to a generated container image, in many cases will want to generate disk images using their container image as input.
For example, generating an ISO that embeds that container image as input and will install it.
In this proposal, we plan to ship a container image as part of Fedora CoreOS that will do this: https://github.com/coreos/fedora-coreos-tracker/issues/1151
But, it also makes sense to have a tool that e.g. does this and generates an Anaconda ISO (we will inherently be doing this as part of generating ostree-based Anaconda ISOs already!) - this would just be supporting that in a clear external way too. One likely target for this is osbuild and RHEL Image Builder.
Feedback
Benefit to Fedora
The need to understand ostree goes away for most users; they understand RPMs and containers. While retaining all the current (rpm-)ostree features.
Scope
- Proposal owners:
- Other developers:
May affect e.g. gnome-software and similar tools that talk to rpm-ostree.
- Release engineering: [1]
- Policies and guidelines: None.
- Trademark approval: N/A (not needed for this Change)
- Alignment with Objectives: None
Upgrade/compatibility impact
We will ship a systemd unit that transitions systems currently using OSTree on the wire over to tracking the corresponding container images. Note again, all features of rpm-ostree continue to work! For example, if you have layered packages, that will continue to be applied.
How To Test
Build container images, boot them.
User Experience
Users will not need to understand ostree (at least at a superficial level), only container images.
Dependencies
Needs improvements in Anaconda in some cases, also would like to increase alignment with dnf. Fetching container images uses skopeo
, maintained by containers team.
Contingency Plan
- Contingency mechanism: Continue to ship things the way we ship them today
- Contingency deadline: Dunno
- Blocks release? No
Documentation
https://coreos.github.io/rpm-ostree/container/ and https://github.com/coreos/coreos-layering-examples etc.