---
title: Run with Podman
description: Run each attempt in one Podman container on the host.
---
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.reeval.ai/llms.txt
> Use this file to discover all available pages before exploring further.

`podman()` returns a sandbox that runs each attempt in one container that the `podman` CLI starts on the host.

## Requirements

`podman()` needs a Podman that answers `podman info` for the account that runs reeval. `reeval doctor` reports it on a `podman` line, with the machine's CPUs and memory and the concurrency reeval derives from them. Before a run, reeval checks the same requirements and exits with code 2 when one fails, naming the fix.

- **Podman {{ podman }} or later.** `podman()` needs its rootless bridge network.
- **On macOS and Windows, a running machine.** reeval reaches it through the machine's API socket or named pipe, unless `CONTAINER_HOST` or `CONTAINER_CONNECTION` names another host. The machine needs at least 4 GB of memory for the default `memory` limit; `reeval doctor` warns below that.
- **Rootless, the `cpu`, `memory`, and `pids` cgroup controllers.** The cgroup of the account that runs reeval must delegate them. A systemd drop-in for the `user@.service` unit with `Delegate=cpu cpuset io memory pids` delegates them, after a new login.

## `podman()`

`{{ pkg }}/sandbox` exports the function. The `sandbox` option accepts its return value:

```ts title="reeval.config.ts"
import { defineConfig } from '{{ pkg }}'
import { podman } from '{{ pkg }}/sandbox'

export default defineConfig({
  sandbox: podman({ memory: '8g', cpus: 4 }),
})
```

`podman()` takes the same options as `docker()`: the image recipes, the resource limits, `id`, `maxConcurrent`, `root`, and `capabilities`. Every option is optional. For each option and its default, see [the `docker()` options](/reference/options#docker). For more information about where the `sandbox` option is accepted, see [Choose a sandbox](/configuration/sandboxes). For a runnable project, see [`with-podman`](https://github.com/invertase/reeval/tree/main/examples/with-podman).

The cell key's last segment defaults to `podman`, or `podman:<image>` when `image` or `from` names another image, or `podman:<name>` for a `dockerfile`, as for `docker()`, plus a hash of `install`. The sandbox's images, egress gateway, and records are the Docker sandbox's.

## Differences from `docker()`

Each difference from `docker()` is in what the host runs, not in the options, the egress policies, or the record. The options are [the `docker()` options](/reference/options#docker).

| Point | `docker()` | `podman()` |
| :--- | :--- | :--- |
| Container CLI | `docker`, against its daemon | `podman`, rootless or as root |
| Network | Docker's default bridge | Podman's `bridge` network, so a restricted `egress` policy leaves no route out |
| Seccomp | Docker uses its default profile | reeval passes Docker's default profile as a file, so Podman refuses the same syscalls |
| `from` and Dockerfile `FROM` names | A short name resolves on Docker Hub | A short name Podman can't resolve needs its registry, such as `docker.io/library/python:3.12-slim` |
| Image digests for `from` | Through `docker buildx` | Through `skopeo` when present, or `podman manifest inspect` |
| Local image names | Docker lists tagged names unchanged | Podman prefixes local names with `localhost/`; reeval strips the prefix when it lists them |
| Cell key segment | `docker` | `podman` |

Podman keeps its own image store. `reeval image build` builds the sandbox images into it, `reeval doctor` reports a missing image as missing in Podman, and `reeval clean --images` prunes reeval's images from each engine that answers.
