Skip to content

feat: bake podman/uidmap/fuse-overlayfs into the actions-runner image - #1

Merged
elasticdotventures merged 1 commit into
mainfrom
feat/podman-runner-image
Aug 3, 2026
Merged

feat: bake podman/uidmap/fuse-overlayfs into the actions-runner image#1
elasticdotventures merged 1 commit into
mainfrom
feat/podman-runner-image

Conversation

@elasticdotventures

Copy link
Copy Markdown
Member

Summary

Adds podman (+ uidmap, fuse-overlayfs) to the runner image, and a new publish-podman-runner.yml workflow that builds/pushes to this fork's own GHCR namespace (ghcr.io/promptexecution/actions-runner-podman), independent of upstream's release-branch-driven docker-publish.yml.

Built for app4dog/middleware#92 (CI's build-image job fails on a self-hosted runner with no docker.sock — docker was deliberately purged in favor of podman-only).

Important finding

Verified locally: the image builds clean, podman --version/podman info work when run directly. But podman run as the runner user inside a container started from this image still can't create its own nested rootless user namespace — newuidmap: write to uid_map failed: Operation not permitted, reproduces even with --privileged on the outer container. This is a real, empirically-confirmed kernel limitation (nesting rootless user-namespace creation two levels deep), not a missing capability flag.

So this image alone doesn't make podman usable for actual builds on a runner that's itself deployed as a rootless podman pod — the consumption model needs to be host-podman-socket passthrough (CONTAINER_HOST pointing at a mounted host podman.sock) rather than this image's own podman trying to create a third nested namespace layer. That wiring lives in the b00t-cli gh-runner tooling, not this repo.

Test plan

  • podman build -f images/Dockerfile --build-arg RUNNER_VERSION=2.336.0 — clean build
  • podman run --user runner <image> podman --version — works
  • /etc/subuid//etc/subgid correctly allocated for the runner user
  • Confirmed the nested-namespace limitation empirically (not guessed) — same failure with default caps, explicit --cap-add SETUID --cap-add SETGID, and --privileged
  • Not yet validated against the actual fung1 self-hosted runner topology — pending

Adds podman (plus uidmap/fuse-overlayfs, needed for rootless
user-namespace + storage-driver support) to the runner image, and a
new publish-podman-runner.yml workflow that builds/pushes it to this
fork's own GHCR namespace (ghcr.io/promptexecution/actions-runner-podman)
independent of upstream's release-branch-driven docker-publish.yml.

Built for app4dog#92 (middleware CI's build-image job fails on a
self-hosted runner with no docker.sock, docker having been
deliberately purged in favor of podman-only). Verified locally: image
builds clean, podman --version/info work when run directly; podman
run as the runner user inside a container started FROM this image
still can't create its own nested rootless user namespace (newuidmap:
Operation not permitted, reproduces even with --privileged on the
outer container) -- this is a real, empirically-confirmed limitation
of nesting rootless user-namespace creation two levels deep, not a
missing capability flag. The intended consumption model is therefore
host-podman-socket passthrough (CONTAINER_HOST pointing at a mounted
host podman.sock) rather than this image's own podman creating a
third nested namespace layer -- see the b00t-cli gh-runner tooling
change that wires this up.
@elasticdotventures
elasticdotventures merged commit 4539846 into main Aug 3, 2026
10 checks passed
@elasticdotventures
elasticdotventures deleted the feat/podman-runner-image branch August 3, 2026 12:56
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