Skip to content

bug(rpm): allow gateway install on Docker hosts without requiring Podman #2007

Description

@pimlock

Agent Diagnostic

  • Checked existing GitHub issues and did not find a duplicate for the RPM/Podman/Docker dependency conflict.
  • Inspected the current RPM and installer paths:
    • openshell.spec makes Podman a weak dependency for the base openshell package with Recommends: podman.
    • openshell.spec makes Podman a hard dependency for the openshell-gateway subpackage with Requires: podman.
    • The RPM user unit has After=podman.socket and Wants=podman.socket.
    • deploy/rpm/gateway.toml.default seeds compute_drivers = ["podman"].
    • install.sh downloads and installs both openshell and openshell-gateway RPMs, then starts the user gateway.
  • Conclusion: the RPM install path currently assumes Podman even when the host already has Docker available.

Description

Actual behavior: Installing openshell-gateway v0.0.68 via RPM on a Rocky 8 host that already uses Docker fails during dependency resolution because the gateway RPM declares a hard dependency on Podman.

The observed failure is:

package openshell-gateway-0.0.68-1.fc44.x86_64 requires podman, but none of the providers can be installed

Podman pulls in runc, which conflicts with the containerd.io package provided by Docker's docker-ce-stable repo. This blocks installation on hosts where Docker is already the standard container runtime.

Expected behavior: The RPM gateway package should be installable on hosts that already have Docker available. Podman should not be required at package install time.

If the selected runtime is unavailable or misconfigured, OpenShell should fail clearly at gateway startup or sandbox creation time, not during package-manager dependency resolution.

Reproduction Steps

  1. Start from a Rocky Linux 8 host configured with Docker from docker-ce-stable.
  2. Install OpenShell v0.0.68 through the RPM/package-manager path.
  3. Observe that dnf attempts to install openshell-gateway and solve Requires: podman.
  4. Observe dependency resolution failure because Podman/runc conflicts with Docker-provided containerd.io.

Environment

  • OS: Rocky Linux 8
  • Existing runtime: Docker
  • OpenShell: v0.0.68
  • Install method: RPM/package-manager path via install.sh
  • Reporter: Eric Busto, reported 2026-06-23
  • Workaround confirmed: manual tarball install from https://gist.github.com/pimlock/1bbd1d8970318d7b0053e164392c95de, confirmed working on a Rocky 8 test VM on 2026-06-25

Logs

root@pdx4-sim-n32-016 log]# curl -LsSf https://raw.githubusercontent.com/NVIDIA/OpenShell/main/install.sh | sh
openshell: resolving latest version...
openshell: downloading v0.0.68 release checksums...
awk: warning: escape sequence `\.' treated as plain `.'
awk: warning: escape sequence `\.' treated as plain `.'
openshell: selected openshell-0.0.68-1.fc44.x86_64.rpm and openshell-gateway-0.0.68-1.fc44.x86_64.rpm
openshell: downloading openshell-0.0.68-1.fc44.x86_64.rpm...
openshell: verifying checksum for openshell-0.0.68-1.fc44.x86_64.rpm...
openshell: downloading openshell-gateway-0.0.68-1.fc44.x86_64.rpm...
openshell: verifying checksum for openshell-gateway-0.0.68-1.fc44.x86_64.rpm...
openshell: installing openshell-0.0.68-1.fc44.x86_64.rpm and openshell-gateway-0.0.68-1.fc44.x86_64.rpm...
Last metadata expiration check: 17:47:33 ago on Mon 22 Jun 2026 06:04:39 PM PDT.
Error:
 Problem: package openshell-gateway-0.0.68-1.fc44.x86_64 from @commandline requires podman, but none of the providers can be installed
  - package podman-4:4.9.4-4.module+el8.10.0+1833+b6e0f287.x86_64 from appstream requires runc >= 1.0.0-57, but none of the providers can be installed
 ...
  - package containerd.io-1.3.7-3.1.el8.x86_64 from docker-ce-stable conflicts with runc provided by runc-1:1.1.12-1.module+el8.10.0+1815+5fe7415e.x86_64 from appstream
...

Proposed Fix

Make the RPM/package-manager path support Docker hosts without requiring Podman.

Likely implementation pieces:

  • Change openshell-gateway RPM metadata so Podman is not a hard Requires.
  • Add an install-script option or environment variable to select the intended local runtime, for example Docker vs Podman.
  • When Docker is selected, seed gateway config with Docker defaults instead of compute_drivers = ["podman"].
  • Revisit After=podman.socket and Wants=podman.socket in the RPM user unit so the service does not implicitly depend on Podman when Docker is selected.
  • Update the RPM default-config test and docs to cover Docker-host package installs.

Agent-First Checklist

  • I pointed my agent at the repo and had it investigate this issue
  • I loaded relevant skills and checked the packaging/install code
  • My agent could not resolve this in-place because this tracks a packaging/install-path behavior change that needs implementation and validation

Activity

  1. pimlock commented on Jun 25, 2026

    @pimlock
    CollaboratorAuthor

    From @drew:

    Also need to update it so the gateway doesn't bind on 0.0.0.0

  2. self-assigned this
    on Jun 25, 2026
  3. pimlock commented on Jul 3, 2026

    @pimlock
    CollaboratorAuthor

    🏗️ build-plan

    Implementation Plan

    Issue type: fix
    Complexity: Medium
    Confidence: High — the package path is clear; the bind-address change should be handled separately

    Summary

    Make the RPM and its user service runtime-neutral so installing openshell-gateway never pulls Podman onto a Docker host. Reuse the existing gateway runtime auto-detection instead of adding an installer-only runtime selector: fresh installs will select a reachable Podman socket when present, otherwise Docker when available.

    Make installer-triggered service failures visible at the top level. If the gateway cannot start because no runtime is usable, the installer will print service status and recent logs, explain how to install/start Docker or Podman or install and explicitly configure VM, and exit nonzero while leaving the installed packages in place.

    Keep the existing RPM 0.0.0.0:17670 bind override in this change. PR #1438 established that rootless Podman sandbox callbacks cannot use the loopback-only default; removing the all-interface bind safely requires a separate Podman networking design and live E2E coverage.

    Scope

    • openshell.spec: remove the base Recommends: podman and gateway Requires: podman, make package descriptions runtime-neutral, remove podman.socket ordering/wants, and preserve first-start config seeding.
    • deploy/rpm/gateway.toml.default: remove the explicit compute_drivers = ["podman"] pin so the gateway uses existing Kubernetes → Podman → Docker auto-detection; retain the current bind override for Podman compatibility.
    • crates/openshell-server/src/config_file.rs: update the RPM template contract test to require no pinned compute driver while retaining the expected bind address.
    • install.sh: guard Linux service enable/restart/active checks and Homebrew service restart; dump service status and recent journal/Homebrew logs before returning an actionable error. Remediation must distinguish installing/starting Docker or Podman from installing and explicitly configuring the VM driver.
    • tasks/scripts/test-install-sh.sh: cover failed service activation/restart paths, diagnostic collection, actionable runtime remediation text, and nonzero installer results after package installation.
    • .github/workflows/rpm-package.yml: verify built RPM metadata has no Podman requirement or recommendation and perform a DNF install transaction with Podman absent.
    • deploy/rpm/QUICKSTART.md, deploy/rpm/CONFIGURATION.md, and deploy/rpm/TROUBLESHOOTING.md: document runtime-neutral installation, Docker and Podman prerequisites, auto-detection, explicit overrides, upgrade behavior, no-runtime startup failure, and recovery.
    • docs/about/installation.mdx: add a package/runtime prerequisite matrix and explain which installers start services automatically or through install.sh.
    • docs/reference/sandbox-compute-drivers.mdx: document that DEB and Homebrew bundle openshell-driver-vm, RPM and Snap do not, separate release tarballs are available, and VM is never auto-detected.
    • docs/reference/gateway-config.mdx: align package-managed auto-detection and explicit VM-selection examples with the runtime-neutral RPM defaults.
    • crates/openshell-driver-vm/README.md: replace the stale RPM Podman-pinned description with the new auto-detection behavior and document separate VM artifact installation for RPM hosts.

    Implementation Steps

    1. Remove all RPM dependency and systemd-unit edges that cause DNF or systemd to pull/start Podman.
    2. Change the seeded RPM configuration to leave compute-driver selection unset so existing runtime auto-detection chooses the available local runtime.
    3. Make every installer-managed service startup failure dump platform-appropriate diagnostics and return an actionable, package-aware error without rolling back the installed package.
    4. Update the RPM config contract test, installer shell tests, and artifact-level package dependency/install assertions.
    5. Update packaged and published documentation with Docker/Podman prerequisites, service-start behavior, the VM inclusion matrix, separate RPM VM installation, no-runtime failure, and recovery paths.
    6. Run focused tests, mise run pre-commit, and the existing RPM/Podman validation path as applicable.

    Test Plan

    • Unit tests: Update rpm_default_config_parses_and_has_podman_defaults to assert the template parses, keeps the RPM bind address, and leaves compute_drivers unset. Extend tasks/scripts/test-install-sh.sh with mocked Linux and Homebrew service failures that assert diagnostics are emitted, remediation distinguishes available container runtimes from separately installed VM support, and the installer exits nonzero. Run existing compute-driver detection tests.
    • Integration tests: In the RPM build workflow, inspect Requires/Recommends, install the generated CLI and gateway RPMs with DNF in the clean Fedora build container, and assert Podman remains uninstalled.
    • E2E tests: Keep the existing Fedora RPM/Podman release canary as regression coverage. No E2E file change is planned; a Rocky 8 host with Docker CE remains the release-level reproduction target.

    Risks & Open Questions

    • Removing only the hard requirement is insufficient because DNF installs Recommends by default; both Podman dependency edges must be removed.
    • Existing user-owned ~/.config/openshell/gateway.toml files remain untouched on upgrade, so an existing Podman pin is preserved intentionally.
    • A direct RPM/DEB package transaction can succeed without a runtime. The higher-level install.sh intentionally exits nonzero if its post-install service verification fails; documentation must make clear that the package remains installed and can be recovered by installing/starting a runtime and restarting the service.
    • VM packaging differs by installer: DEB installs it under /usr/libexec/openshell, Homebrew installs it under the formula libexec, RPM and Snap do not include it, and matching standalone release tarballs are published. VM must always be selected explicitly with compute_drivers = ["vm"] or OPENSHELL_DRIVERS=vm.
    • On RPM hosts, VM remediation requires installing openshell-driver-vm under a configured driver_dir or a conventional path such as ~/.local/libexec/openshell, /usr/libexec/openshell, or /usr/local/libexec/openshell; configuration alone is insufficient.
    • Startup diagnostics must not claim that every failure is caused by a missing runtime. They should show the underlying logs first and present runtime setup as the common remediation for driver-selection failures.
    • Binding only to loopback is not included. The previous RPM regression fix documents that this breaks rootless Podman callbacks, so it should be tracked as a separate networking issue unless maintainers request a broader redesign.
    • No process identity, /proc, binary execution, SELinux, or AppArmor behavior changes are expected.

    Documentation Impact

    Update the RPM quickstart, configuration, and troubleshooting guides; general installation page; gateway configuration reference; compute-driver reference; and VM driver README. The docs will include a package/runtime prerequisite matrix, service-start behavior, VM inclusion and manual-install paths, explicit VM selection, and no-runtime recovery. No Helm or gateway TOML schema changes are expected.


    Revision 3 — document runtime prerequisites and VM packaging differences
    Revision 2 — add installer startup diagnostics and no-runtime recovery coverage
    Revision 1 — initial plan

  4. pimlock commented on Jul 3, 2026

    @pimlock
    CollaboratorAuthor

    Implemented in #2137.

    The RPM no longer requires or recommends Podman and its user service no longer orders against podman.socket. Fresh RPM configs leave compute-driver selection unset so the gateway can select a reachable Podman socket or Docker. Installer-managed startup failures now print service diagnostics, explain that OpenShell remains installed, and provide Docker/Podman or explicitly configured VM recovery steps.

    The PR also adds RPM metadata/DNF transaction coverage, installer failure tests, the RPM config contract update, and documentation for runtime prerequisites and VM packaging across DEB, RPM, Homebrew, and Snap.

    The existing 0.0.0.0:17670 RPM bind override remains unchanged because rootless Podman callbacks require it; loopback binding should be tracked separately.

    Validation: mise run pre-commit, mise run test, and mise run ci all pass locally.

  5. added
    state:pr-openedPR has been opened for this issue
    and removed on Jul 3, 2026
  6. github-actions commented on Jul 18, 2026

    @github-actions

    This issue has had no activity for 14 days and is now marked stale. It may be closed in 7 days if there is no further activity. Comment or remove the state:stale label to keep it open.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

state:pr-openedPR has been opened for this issuestate:staleInactive item at risk of automatic closure.

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions