podman 47,580 build reads BookNest's Dockerfile unchanged, BuildKit-style cache and secret mounts included, because it uses Buildah 919,369 underneath. One difference hides in the image format: Podman writes OCI images by default, and the OCI image configuration has no field for HEALTHCHECK. Podman also has pods, groups of containers that share one network namespace, exactly like a Kubernetes 5,150 pod, so the API reaches PostgreSQL 1,289 on 127.0.0.1:
podman build -t booknest-api:oci . 2>&1 | grep -o 'HEALTHCHECK is not[^"]*' | head -1
podman build -q --format docker -t booknest-api:1.3 . >/dev/null
for t in oci 1.3; do
podman image inspect -f "$t: {{json .Config.Healthcheck}}" booknest-api:$t | cut -c 1-45
done; podman rmi -f booknest-api:oci >/dev/null
podman pod create --name l3-booknest -p 127.0.0.1:33380:3000 >/dev/null
podman run -d --pod l3-booknest --name l3-pdb -e POSTGRES_USER=booknest \
-e POSTGRES_PASSWORD=bn-pod-2026 docker.io/library/postgres:18 &>/dev/null; sleep 8
podman run -d --pod l3-booknest --name l3-papi -e PGHOST=127.0.0.1 -e PGPASSWORD=bn-pod-2026 \
localhost/booknest-api:1.3 >/dev/null; sleep 4
podman ps --pod --format '{{.Names}} {{.PodName}} {{.Status}}'
curl -s localhost:33380/api/books/3 | cut -c 1-60; echo
podman kube generate l3-booknest | grep -E '^kind|image:|hostPort'
podman pod rm -f l3-booknest >/dev/nullHEALTHCHECK is not supported for OCI image format and will be ignored. Must use `docker` format
oci: null
1.3: {"Test":["CMD","node","-e","fetch('http:
a918508f1ee6-infra l3-booknest Up 14 seconds
l3-pdb l3-booknest Up 14 seconds
l3-papi l3-booknest Up 5 seconds (healthy)
{"id":3,"title":"Salt and Saffron","author":"Priya Nair","ge
kind: Pod
image: docker.io/library/postgres:18
hostPort: 33380
image: localhost/booknest-api:1.3The default build silently dropped the healthcheck; --format docker keeps it, and Podman then reports the API as healthy, just as Docker 514 , Compose 514 and Swarm 514 would. The pod's third container, -infra, only holds the shared namespaces, the role Kubernetes gives its "pause" container. podman kube generate turned the running pod into a Kubernetes Pod manifest, and podman kube play runs such a file locally, a gentle bridge to Kubernetes. For Compose files, podman compose hands the file to an installed provider (docker-compose or the Python podman-compose 6,226 , github.com/containers/podman-compose (https://github.com/containers/podman-compose 6,226 )), and for services that should start at boot, Podman's Quadlet turns a small .container file into a systemd 142,543 unit, with no daemon to supervise.