Skip to content

install: logically bound images are not installed with --composefs-backend #2540

Open

Description

@andrewdunndev

With --composefs-backend, bootc install doesn't copy logically bound images into the installed system. The install exits 0 and prints nothing about bound images. The same install without --composefs-backend puts the image in /ostree/bootc/storage.

Reproduced on quay.io/fedora/fedora-bootc:44 (bootc 1.16.13), binding a busybox image by a tag that is in the host storage before the install:

podman pull docker.io/library/busybox@sha256:f97baa533a26513c453a362be331a43eb60214302f449c16571b23cea141dce4
podman tag docker.io/library/busybox@sha256:f97baa533a26513c453a362be331a43eb60214302f449c16571b23cea141dce4 docker.io/library/busybox:latest
FROM quay.io/fedora/fedora-bootc:44@sha256:5ab8ee5189bb0f3870279723f5343474df002d8d6f46564702b3ad3ba7382d98
COPY bound.container /usr/share/containers/systemd/bound.container
RUN mkdir -p /usr/lib/bootc/bound-images.d && ln -s /usr/share/containers/systemd/bound.container /usr/lib/bootc/bound-images.d/bound.container
# bound.container
[Container]
Image=docker.io/library/busybox:latest
podman build -t localhost/gaprepro:1 .
truncate -s 20G a.raw b.raw
podman run --rm --privileged --pid=host --security-opt label=type:unconfined_t \
  -v /dev:/dev -v /var/lib/containers:/var/lib/containers -v $PWD:/out localhost/gaprepro:1 \
  bootc install to-disk --via-loopback --filesystem ext4 --generic-image --wipe \
  --composefs-backend /out/a.raw
# the same again without --composefs-backend, writing b.raw

With each root partition mounted, ostree/bootc/storage/overlay-images/images.json on the ostree disk lists busybox:latest. The composefs disk has no container storage, and the only file on it that mentions busybox is the stock 000-shortnames.conf.

The composefs install doesn't read bound-images.d at all. With a regular file there instead of a symlink, the ostree install fails with Querying bound images: Not a symlink: bound.container, and the composefs install completes.

BoundImages::from_state is called only from ostree_install (install.rs L2092), and the copy happens in install_with_sysroot (L2029-L2043). The composefs branch (L2156-L2226) has neither, and plan-22-logically-bound-install is skipped on composefs (integration.fmf L69-L75).

I'd expect bound images to be present at first boot on both backends, as bootc-logically-bound-images(7) describes.

Related: #2290, which pulls bound images on the composefs deploy path.

Activity

  1. cgwalters commented on Oct 5, 2026

    @cgwalters
    Collaborator

    Thanks for filing this (and other issues).

    I think it's clear we probably should not have declared the backend stable without going over the test suite and ensuring we had parity. The root problem is everything under extra-fixme_skip_if_composefs: true.

    For now, my inclination here is to first make this case an explicit error.

  2. modified the milestones: 1.17, 1.18 on Oct 5, 2026
  3. removed this from the 1.18 milestone on Oct 9, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions