Convert a Docker Compose file into a POSIX sh script that runs its services as a single Podman pod.
Built for CI and test environments where you can't use docker compose or podman kube play:
- No bridge networking / netavark. Unprivileged CI containers often have a read-only
/proc/sys, so netavark fails to create bridge networks. A single pod shares one network namespace with no bridge: services talk over127.0.0.1, and names resolve via a generated/etc/hoststhe script owns. - No systemd. Podman healthchecks are normally scheduled by systemd timers. compose2pod gates startup by polling
podman healthcheck rundirectly, sodepends_on: service_healthyworks without systemd. - No heavy runtime. The core is stdlib-only — no dependencies, no compiled wheels — so it installs and runs in minimal Python images.
Requirements
compose2pod's generated scripts own /etc/hosts: they write it to a temp
file and bind-mount it read-only into every container under --no-hosts, so
pod-internal name resolution works on any Podman version. host.containers.internal /
host.docker.internal are not provided — add an explicit extra_hosts
entry if you need them.
Install
pip install compose2pod # core: reads compose as JSON
pip install compose2pod[yaml] # optional: read YAML directly (adds PyYAML)
Usage
# YAML directly (needs the [yaml] extra)
compose2pod docker-compose.yml --target app --image myimage:ci > run.sh
# Or stay dependency-free by piping JSON (e.g. via yq)
yq -o=json '.' docker-compose.yml | compose2pod --target app --image myimage:ci > run.sh
sh ./run.sh
Supported compose subset
compose2pod refuses every document docker compose config refuses — a
measured property, checked continuously by a differential conformance harness
that runs the real Docker CLI and the real compose2pod pipeline over the same
YAML. So a file that compiles is a file Docker would run; where compose2pod
still refuses a form Docker accepts, it is because Podman genuinely cannot
express it (each such case is documented, not guessed).
Within that boundary it covers most of what real compose files use:
- Services —
image/build,command/entrypoint,environmentandenv_file(string and long-form{path, required, format}),volumes(short-form and long-form--mount, including thebind/volume/tmpfsoption maps),tmpfs,healthcheck,depends_on(all conditions), networkaliases,hostname/container_name. - Confinement & metadata —
user,working_dir,read_only,init,privileged,cap_add/cap_drop,security_opt,devices,group_add,platform,labels,annotations,pull_policy(the quoted-boolean and YAML-1.1 spellings Docker accepts, too). - Resources — the legacy keys (
mem_limit,cpus,pids_limit,ulimits, …) and the moderndeploy.resourcesblock. - Pod-wide —
dns/dns_search/dns_opt,sysctls,extra_hosts. - Composition — same-file
extends,secrets/configs,profiles.
Compose extension fields (any x--prefixed key) and YAML anchors are accepted
as-is, so a top-level x-* anchor block for shared config just works.
${VAR}-style variable interpolation is left live in the generated script,
resolved by its shell against the environment present when the script runs (no
.env file support). The boundary rulings — which forms are refused, and why —
are recorded in docs/adr/.
Status
Beta. Part of the modern-python family. MIT licensed.
Metadata
Release files for compose2pod 0.4.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| compose2pod-0.4.3.tar.gz | 57.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| compose2pod-0.4.3-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 123.7 kB
Release files / compose2pod-0.4.3.tar.gz
| Download URL | compose2pod-0.4.3.tar.gz |
|---|---|
| Size | 57.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
96566e2e489d9dfaadd4476f8035ecced32632f9fc97288fc79c7fe657345f46
|
|
BLAKE2b-256 checksum How to use checksums |
c6e74f82040dd5f5cc8a7fb11a4e8dec4f6a69637fa4bfdef6d39b63f2827d13
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.17 {"installer":{"name":"uv","version":"0.12.17","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / compose2pod-0.4.3-py3-none-any.whl
| Download URL | compose2pod-0.4.3-py3-none-any.whl |
|---|---|
| Size | 66.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
701024b3c139412afe34fa915bf4408c091506b463474101f8c6bab0f11d0633
|
|
BLAKE2b-256 checksum How to use checksums |
3fcd0b5a00d0dd668bc458adef5d12fc19097f8d349697a83a86234dc862370f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.17 {"installer":{"name":"uv","version":"0.12.17","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|