ScanopyScanopy
Integrations

Set up Podman discovery

How Scanopy discovers Podman containers and pods, via the local socket or a remote Podman API proxy.

Scanopy daemons discover Podman containers by connecting to the Podman API. On the daemon's own host that happens automatically; reaching a restricted API, or one on another machine, needs a proxy.

Before you start

Podman credentials are created under Assets > Credentials and can be pointed at Daemon hostRemote hosts.

Creating a credential, assigning it, and overriding it on an individual host work the same way for every integration — see Creating a credential, Where a credential applies, and Auto-assignment. This guide covers only what is specific to Podman.

What gets discovered

  • Running containers, with their names and metadata
  • Container networks and published port bindings, including automatically created bridge subnets
  • Containerized services, identified from the API rather than from a port scan — so containers that publish nothing to the host are still detected

Containers appear as Podman Container services on their host. Pods are modeled as generic containers with each container in the pod attributed individually. The container-to-host relationship shows up in the Workloads perspective.

Discovery is local to one host: the daemon sees the containers on its own machine, or on the single host a proxy credential points at.

Prerequisites

  • Podman running on the host whose containers you want to discover

  • The API socket enabled — it isn't always running by default:

    # Rootless (per-user socket at $XDG_RUNTIME_DIR/podman/podman.sock)
    systemctl --user start podman.socket
    
    # Rootful (system socket at /run/podman/podman.sock)
    sudo systemctl start podman.socket
  • For proxied access, a TCP endpoint in front of that socket, reachable from the daemon

Rootless vs rootful. A rootless socket only sees that user's containers, and rootless networking may not expose a bridge subnet. Run the daemon (or the proxy) as the same user that owns the containers you want to discover, or use the rootful socket for host-wide visibility.

Choosing a credential type

Credential typeHow it connectsCan be targeted atRequires daemon
Podman ProxyConnects over TCP, optionally with TLS.Daemon hostRemote hosts0.17.2 or later
Podman SocketConnects via the daemon's local socket.Daemon host0.17.2 or later
SituationUse
Daemon runs on the Podman host and the socket is in a standard locationNothing — the socket is auto-detected
Daemon runs on the Podman host, but the socket is elsewherePodman Socket
You want to restrict which API operations the daemon can callPodman Proxy, with the proxy on the same host
Podman runs on a machine with no daemonPodman Proxy, with the proxy on that machine

Podman Proxy

A proxy in front of the socket lets you restrict which API operations are allowed, and lets a daemon reach Podman on a machine it isn't running on.

Any reverse proxy that forwards to the socket works — for example an nginx proxy mapping a TCP port onto /run/podman/podman.sock, optionally terminating TLS. To discover containers on a machine that runs no daemon: expose the endpoint there, create a Podman Proxy credential with its port, and assign it to the remote host. Containers are then reported as services on the remote host rather than on the daemon's host.

FieldRequiredDefaultDescription
Connection
Podman API PortOptional2375Podman API port. Point at a TCP-exposed Podman service (e.g. `podman system service tcp:`) directly or behind a TLS proxy.
URL Path PrefixOptionalNoneOptional URL path prefix appended after the port
TLS
SSL CertificateOptionalNonePEM-encoded client certificate. All three TLS fields (cert, key, CA chain) must be provided together.
SSL Private KeySecretOptionalNonePEM private key. All three TLS fields must be provided together.
SSL CA ChainOptionalNonePEM-encoded CA certificate chain. All three TLS fields must be provided together.

The TLS fields apply to HTTPS endpoints only. Each can be entered inline or as a file path readable by the daemon.

Required API operations

Podman exposes a Docker-compatible API, and Scanopy uses that compatibility layer. Restrict the proxy to these endpoints:

EndpointMethodPurpose
/containers/jsonGETList running containers
/containers/{id}/jsonGETGet container details (ports, networks, config)
/networksGETList networks for subnet discovery
/exec/{id}/jsonGETCheck exec instance status
/containers/{id}/execPOSTCreate exec instance for endpoint probing
/exec/{id}/startPOSTStart exec to probe HTTP endpoints inside containers

Why exec? Scanopy uses exec to probe HTTP endpoints from inside containers that don't publish ports to the host. Without exec access, containers are still discovered but service detection is less accurate.

Podman Socket

The daemon connects directly to the Podman socket on its own host, automatically, whenever it's accessible. It looks in this order:

  1. The CONTAINER_HOST environment variable, when it points at a unix:// socket path
  2. The rootful socket: /run/podman/podman.sock
  3. The rootless socket: $XDG_RUNTIME_DIR/podman/podman.sock

Create a Podman Socket credential only when your socket is somewhere else — its path overrides the auto-detection above.

FieldRequiredDefaultDescription
Socket PathOptionalNonePath to the Podman Unix socket. Leave blank to auto-detect (rootful /run/podman/podman.sock or the rootless $XDG_RUNTIME_DIR/podman/podman.sock).

Because the socket is reachable only over the daemon's own loopback, this credential type can be assigned to a daemon host and nowhere else.

Verifying it works

  1. Go to Discover > Scan > Scheduled and run a discovery, or wait for the next scheduled run
  2. Open the host running Podman and go to its Services tab
  3. Look for Podman Container services, each with its published ports
  4. Open the Workloads perspective and confirm the containers appear nested under their host

Troubleshooting

No containers discovered

  1. Confirm the API socket is running: systemctl --user status podman.socket (rootless) or sudo systemctl status podman.socket (rootful)
  2. Confirm the daemon can see the socket path — check CONTAINER_HOST, /run/podman/podman.sock, and $XDG_RUNTIME_DIR/podman/podman.sock
  3. If the daemon and the containers run under different users, the rootless socket won't expose them — run both as the same user, or use the rootful socket

"Connection refused" to a proxy

  1. Verify the proxy is running and listening on the expected port
  2. Ensure the daemon can reach it — same network, or an exposed port
  3. Check the proxy forwards to a valid Podman socket path

SSL certificate errors

  1. Verify certificate paths are correct and mounted
  2. Check the certificate is valid: openssl x509 -in /certs/client-cert.pem -text -noout
  3. Include the CA chain if using self-signed certs
  4. Check that the cert and key aren't swapped

For diagnosing credential loading and file read or PEM errors from daemon logs, see Credential troubleshooting.

On this page