Skip to content

Support root-less containers with --in-vm#1189

Open
alexlarsson wants to merge 1 commit intomainfrom
support-rootless
Open

Support root-less containers with --in-vm#1189
alexlarsson wants to merge 1 commit intomainfrom
support-rootless

Conversation

@alexlarsson
Copy link
Contributor

This updates to the latest image-builder-cli, adding support for rootless container use
(osbuild/image-builder-cli#445).

It also updates the use of related APIs to pass runInVm options where needed.

With this, I was able to run a rootless bc-i-b conversion. There is one problem, which is that if you mount ~/.local/share/containers/storage on the host to /var/lib/containers/storage in the contained, podman will complain with:

Error: database static dir "~/.local/share/containers/storage/libpod" does not match our static dir "/var/lib/containers/storage/libpod": database configuration mismatch

Additionally, if you pass the host "/var/lib/containers/storage" into the rootless container you will get read permission errors.

There are two workarounds for this. Either you can use e.g. skopeo to copy the bootc container to a separate (non-root) container storage directory and mount that, or you can cover the "db.sql" file in the storage directory to make podman not print the error.

Neither of these are super clean, and we should try to figure out a better solution, but for now I was at least able to run a complete image build using:

$ touch /tmp/foo
$ podman run --rm --security-opt label=type:unconfined_t -ti --privileged \
  --network=none -v $PWD/output:/output \
  -v ~/.local/share/containers/storage:/var/lib/containers/storage \
  -v /tmp/foo:/var/lib/containers/storage/db.sql \
  localhost/bootc-image-builder  --in-vm \
  --rootfs ext4 --type raw \
  quay.io/fedora/fedora-bootc:43

@alexlarsson alexlarsson requested a review from a team as a code owner January 29, 2026 14:09
@alexlarsson alexlarsson requested review from bcl, croissanne and supakeen and removed request for a team January 29, 2026 14:09
@alexlarsson alexlarsson changed the title Support root-less containers with --in.vm Support root-less containers with --in-vm Jan 29, 2026
This updates to the latest image-builder-cli, adding support for
rootless container use
(osbuild/image-builder-cli#445).

It also updates the use of related APIs to pass runInVm options where
needed.

With this, I was able to run a rootless bc-i-b conversion.

There is one problem, which is that if you mount
`~/.local/share/containers/storage` on the host to
`/var/lib/containers/storage` in the container, podman will complain
with:

```
Error: database static dir "~/.local/share/containers/storage/libpod"
does not match our static dir "/var/lib/containers/storage/libpod":
database configuration mismatch
```

Additionally, if you pass the host `/var/lib/containers/storage` into
the rootless container you will get read permission errors.

There are two workarounds for this. Either you can use e.g. skopeo to
copy the bootc container to a separate (non-root) container storage
directory and mount that, or you can cover the `db.sql` file in the
storage directory to make podman not print the error.

Neither of these are super clean, and we should try to figure out a
better solution, but for now I was at least able to run a complete
image build using the "cover db" apprach like this:

```
$ touch /tmp/foo
$ podman run --rm --security-opt label=type:unconfined_t -ti --privileged \
  --network=none -v $PWD/output:/output \
  -v ~/.local/share/containers/storage:/var/lib/containers/storage \
  -v /tmp/foo:/var/lib/containers/storage/db.sql \
  localhost/bootc-image-builder  --in-vm \
  --rootfs ext4 --type raw \
  quay.io/fedora/fedora-bootc:43
```
alexlarsson added a commit to osbuild/image-builder-cli that referenced this pull request Feb 2, 2026
When running in a rootless container (made possible via
osbuild/bootc-image-builder#1189) then
generally the per-user container store is passed to bc-i-b, both
because that makes sense, but also because the container doesn't have
permissions to read the host store. This is typically done by passing
`-v ~/.local/share/containers/storage:/var/lib/containers/storage`
when running bc-i-b in podman.

Unfortunately when this happens, podman complains that the store
is in the wrong place:

```
Error: database static dir "/home/alex/.local/share/containers/storage/libpod" does not match our static dir "/var/lib/containers/storage/libpod": database configuration mismatch
```

To fix this, we pass in podman arguments `--root` and `--imagestore`
to set up an environment where the graphroot is some empty directory
that has the "correct" location and we only load the image layers from
/var/lib/containers.

To ensure this doesn't weirdly affect the regular case, this is all
protected by podmanutil.IsRootless().
alexlarsson added a commit to osbuild/image-builder-cli that referenced this pull request Feb 2, 2026
When running in a rootless container (made possible via
osbuild/bootc-image-builder#1189) then
generally the per-user container store is passed to bc-i-b, both
because that makes sense, but also because the container doesn't have
permissions to read the host store. This is typically done by passing
`-v ~/.local/share/containers/storage:/var/lib/containers/storage`
when running bc-i-b in podman.

Unfortunately when this happens, podman complains that the store
is in the wrong place:

```
Error: database static dir "/home/alex/.local/share/containers/storage/libpod" does not match our static dir "/var/lib/containers/storage/libpod": database configuration mismatch
```

To fix this, we pass in podman arguments `--root` and `--imagestore`
to set up an environment where the graphroot is some empty directory
that has the "correct" location and we only load the image layers from
/var/lib/containers.

To ensure this doesn't weirdly affect the regular case, this is all
protected by podmanutil.IsRootless().
alexlarsson added a commit to osbuild/image-builder-cli that referenced this pull request Feb 2, 2026
When running in a rootless container (made possible via
osbuild/bootc-image-builder#1189) then
generally the per-user container store is passed to bc-i-b, both
because that makes sense, but also because the container doesn't have
permissions to read the host store. This is typically done by passing
`-v ~/.local/share/containers/storage:/var/lib/containers/storage`
when running bc-i-b in podman.

Unfortunately when this happens, podman complains that the store
is in the wrong place:

```
Error: database static dir "/home/alex/.local/share/containers/storage/libpod" does not match our static dir "/var/lib/containers/storage/libpod": database configuration mismatch
```

To fix this, we pass in podman arguments `--root` and `--imagestore`
to set up an environment where the graphroot is some empty directory
that has the "correct" location and we only load the image layers from
/var/lib/containers.

To ensure this doesn't weirdly affect the regular case, this is all
protected by podmanutil.IsRootless().
alexlarsson added a commit to osbuild/images that referenced this pull request Feb 2, 2026
When running in a rootless container (made possible via
osbuild/bootc-image-builder#1189) then
generally the per-user container store is passed to bc-i-b, both
because that makes sense, but also because the container doesn't have
permissions to read the host store. This is typically done by passing
`-v ~/.local/share/containers/storage:/var/lib/containers/storage`
when running bc-i-b in podman.

Unfortunately when this happens, podman complains that the store
is in the wrong place:

```
Error: database static dir "/home/alex/.local/share/containers/storage/libpod" does not match our static dir "/var/lib/containers/storage/libpod": database configuration mismatch
```

To fix this, we pass in podman arguments `--root` and `--imagestore`
to set up an environment where the graphroot is some empty directory
that has the "correct" location and we only load the image layers from
/var/lib/containers.

To ensure this doesn't weirdly affect the regular case, this is all
protected by podmanutil.IsRootless().

Note: This is similar to what is done in
osbuild/image-builder-cli#447 and it has
a local copy of podmanutil.IsRootless() from image-builder-cli.
@alexlarsson
Copy link
Contributor Author

In combination with: osbuild/image-builder-cli#447 and osbuild/images#2167 i was able to avoid any workarounds when using the user container store as well.

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.

1 participant