Skip to content

oci: Add OCI-native manifest/config storage and image management#216

Merged
jeckersb merged 1 commit intocomposefs:mainfrom
cgwalters:oci-native-layer
Feb 11, 2026
Merged

oci: Add OCI-native manifest/config storage and image management#216
jeckersb merged 1 commit intocomposefs:mainfrom
cgwalters:oci-native-layer

Conversation

@cgwalters
Copy link
Collaborator

@cgwalters cgwalters commented Jan 27, 2026

Switch how we store OCI images to also include and identify
images by having explicit oci/ tags which point to a manifest,
which points to a config.

We continue to generate splitstream for manifest and config, but
we now always store the original context as "external" objects.
A big rationale for this is it will align with a future proposal
for composefs OCI sealing where we include fsverity signatures
for the manifest/config as a detached object.

With this for example, bootc can stop storing the manifest on its own.
See-also: bootc-dev/bootc#1830

Other big features:

  • Full general support for OCI artifacts as well
  • Support for OCI referrers as well (to store sigstore and future
    composefs signatures)

Finally we have an initial sketch for storing multi-arch images.

Assisted-by: OpenCode (Opus 4.5)

@cgwalters cgwalters force-pushed the oci-native-layer branch 2 times, most recently from 0ece424 to 10bb53f Compare January 29, 2026 01:44
@cgwalters
Copy link
Collaborator Author

Something I want to highlight in this PR that I think is quite cool and important is that this project is now more directly/obviously supporting non-container OCI types i.e. OCI artifacts.

Often when people say "OCI" they think of course about the classic tar layer container images, but that's not the only use case for OCI. And it makes an equal amount of sense to store e.g. AI model training weights or disk images in a composefs repo as it does OCI.

So again "OCI" != "OCI container images" in general.

@allisonkarlitskaya
Copy link
Collaborator

I looked briefly. This seems like pretty cool/useful stuff...

There's a bit of tension here with #218. What's the eventual plan? Import via containers-image-proxy-rs, or skip skopeo and use the cstor-rs stuff (via jsonrpc) directly?

@cgwalters
Copy link
Collaborator Author

There's a bit of tension here with #218.

The two PRs are 100% compatible AFAICS and complementary. This is just extending things so we store the manifest too etc., it's orthogonal to how we fetch the data.

What's the eventual plan? Import via containers-image-proxy-rs, or skip skopeo and use the cstor-rs stuff (via jsonrpc) directly?

I think for bootc we will likely always fetch via podman/skopeo for the near term future by default because of the "containers/image" part of container-libs (talking to registries, registries.conf auth file handling etc.) into a containers-storage, and then reflink from there into composefs (and then reflink from there into ostree if enabled).

@cgwalters cgwalters requested a review from jeckersb February 2, 2026 13:46
@cgwalters
Copy link
Collaborator Author

With this (unlike containers-storage) we store the transport. So I think with this we wouldn't need an "origin" in bootc - it would just map from e.g. UKI -> "image".

My opinion is that while the true "composefs core" is today and
should remain logically flexible, there's absolutely not reason for
us not to have a very opinionated mechanism to store OCI. Very very
key to this is that OCI is not just container images (with tar media
types) - there's nowadays OCI artifacts which allow storing arbitrary
data easily - and I think mapping "foreign" types to OCI makes a
ton of sense.

ref https://docs.podman.io/en/latest/markdown/podman-artifact.1.html how stores things separately.

@cgwalters cgwalters marked this pull request as ready for review February 6, 2026 21:34
@cgwalters cgwalters force-pushed the oci-native-layer branch 2 times, most recently from df741d1 to ae68d2e Compare February 8, 2026 18:16
Switch how we store OCI images to also include and identify
images by having explicit `oci/` tags which point to a manifest,
which points to a config.

We continue to generate splitstream for manifest and config, but
we now always store the original context as "external" objects.
A big rationale for this is it will align with a future proposal
for composefs OCI sealing where we include fsverity signatures
for the manifest/config as a detached object.

With this for example, bootc can stop storing the manifest on its own.

Other big features:

 - Full general support for OCI artifacts as well
 - Support for OCI referrers as well (to store sigstore and future
   composefs signatures)

Finally we have an initial sketch for storing multi-arch images.

Assisted-by: OpenCode (Opus 4.6)
Signed-off-by: Colin Walters <walters@verbum.org>
@cgwalters cgwalters changed the title oci: Extend with more OCI-native manifest/config storage oci: Add OCI-native manifest/config storage and image management Feb 8, 2026
stream.add_named_stream_ref(name, value)
}
stream.write_inline(json_bytes);
stream.write_external(json_bytes)?;
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Collaborator

@jeckersb jeckersb left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍 we went over this in a live session earlier

@jeckersb jeckersb merged commit fc1d4e2 into composefs:main Feb 11, 2026
15 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants