Skip to content
Crow CI

Backend: Podman (Experimental)

Podman backend configuration variables for agents. The Podman backend uses the native Podman Go SDK (github.com/containers/podman) for direct communication with Podman, supporting both rootful and rootless installations.

  • Name: CROW_BACKEND_PODMAN_HOST
  • Description: Podman socket address. If not set, auto-detects the socket location (rootful at /run/podman/podman.sock, rootless at $XDG_RUNTIME_DIR/podman/podman.sock).
  • Default: auto-detect

  • Name: CROW_BACKEND_PODMAN_NETWORK
  • Description: Podman network which will be attached to all pipeline steps. Careful: this allows containers of different steps to communicate with each other.
  • Default: none

  • Name: CROW_BACKEND_PODMAN_ENABLED_IPV6
  • Description: Whether to enable IPv6 support in Podman containers. Requires the Podman network to be configured with IPv6 support.
  • Default: false

  • Name: CROW_BACKEND_PODMAN_VOLUMES
  • Description: Additional volumes to mount in Podman containers.
  • Default: none

  • Name: CROW_BACKEND_PODMAN_LIMIT_MEM
  • Description: Whether to limit memory usage in Podman containers. No limit is applied if set to 0.
  • Default: 0

  • Name: CROW_BACKEND_PODMAN_LIMIT_MEM_SWAP
  • Description: Whether to limit memory swap usage in Podman containers. No limit is applied if set to 0.
  • Default: 0

  • Name: CROW_BACKEND_PODMAN_LIMIT_SHM_SIZE
  • Description: Whether to limit shared memory size in Podman containers. No limit is applied if set to 0.
  • Default: 0

  • Name: CROW_BACKEND_PODMAN_LIMIT_CPU_QUOTA
  • Description: Microseconds per CPU quota before throttling takes place. No limit is applied if set to 0.
  • Default: 0

  • Name: CROW_BACKEND_PODMAN_LIMIT_CPU_SHARES
  • Description: CPU shares (relative weight) for Podman containers. No limit is applied if set to 0.
  • Default: 0

  • Name: CROW_BACKEND_PODMAN_LIMIT_CPU_SET
  • Description: Comma-separated list of specific CPU cores the pipelines are limited to. No limit is applied if set to 0.
  • Default: none

  • Name: CROW_BACKEND_HTTP_PROXY
  • Description: If set, pass the environment variable down as “HTTP_PROXY” to steps.
  • Default: none

  • Name: CROW_BACKEND_HTTPS_PROXY
  • Description: If set, pass the environment variable down as “HTTPS_PROXY” to steps.
  • Default: none

  • Name: CROW_BACKEND_NO_PROXY
  • Description: If set, pass the environment variable down as “NO_PROXY” to steps.
  • Default: none

The Podman backend supports rootless installations. When CROW_BACKEND_PODMAN_HOST is not set, the backend automatically detects:

  1. Rootful socket: /run/podman/podman.sock
  2. Rootless socket: $XDG_RUNTIME_DIR/podman/podman.sock

The Podman backend aims for feature parity with the Docker backend but there are architectural and behavioral differences to be aware of.

DockerPodman
SDKDocker Go SDKNative Podman Go bindings
DaemonLong-running daemon (dockerd)Daemonless — communicates via a socket API
RootlessRequires extra setup (rootless mode)First-class rootless support
Socket location/var/run/docker.sockAuto-detected (rootful or rootless)
TLS remote accessSupported (CROW_BACKEND_DOCKER_TLS_VERIFY, CROW_BACKEND_DOCKER_CERT)Not yet supported — local socket only
DockerPodman
Default network driverbridge (Linux), nat (Windows)bridge
IPv6CROW_BACKEND_DOCKER_ENABLE_IPV6CROW_BACKEND_PODMAN_ENABLE_IPV6
Network creationFails if name conflictsTolerates “already exists” and reuses

Docker multiplexes stdout/stderr through the Docker stream protocol and uses stdcopy.StdCopy to demultiplex. Podman streams stdout and stderr over separate channels and tags each line with a 0x01 (stdout) or 0x02 (stderr) prefix byte before writing to the pipe. The end result is the same for users but the internal plumbing differs, which may surface edge-case differences with very large or interleaved log output.

Features not yet available in the Podman backend

Section titled “Features not yet available in the Podman backend”
  • Stale resource cleanup — The Docker backend periodically removes orphaned containers, networks, and volumes that outlive a configurable threshold. The Podman backend does not implement this yet.
  • Remote TLS connections — Docker supports connecting to a remote daemon over TLS. The Podman backend currently only supports local Unix sockets.
  1. Set CROW_BACKEND=podman on your agent.
  2. Ensure the Podman socket service is running:
    • Rootful: systemctl start podman.socket
    • Rootless: systemctl --user start podman.socket
  3. Rename any CROW_BACKEND_DOCKER_* environment variables to their CROW_BACKEND_PODMAN_* equivalents (see the table above).
  4. Verify your pipelines pass — most workflows work without changes.