Six and a half months after the first announcement and 22 betas and 2 rcs later, v1.0.0 is out.
incus-compose brings the familiar Docker Compose workflow to Incus: multi-container apps from standard Compose files. Just point it at a compose.yaml and run incus-compose up. The idea started with Brian’s proof-of-concept; this is a ground-up build, rewritten three times to get the core right.
What’s in 1.0:
The workflow you know:
- Familiar commands:
up,down,start,stop,restart,list(andps),logs,exec,config, plusbuild,healthd,incus(pass-through), andself-update - Compose project parsing via compose-go:
.envinterpolation, profiles,depends_on, secrets, and configs - Automatic
compose.incus.yamloverride file - keep the upstream compose file untouched and put Incus tuning next to it doc - Windows and macOS clients: No Docker Desktop, no WSL, no local Linux VM.
incus-composeand theincusclient are portable Go binaries — from a Windows or macOS desktop you drive a remote Incus host over HTTPS and manage OCI containers, LXC system containers, and VMs directly. See Installing on Windows. - Configuration via
INCUS_COMPOSE_*environment variables for every flag, with a configurable parallel worker count doc
Images:
- OCI image pulling from docker.io, ghcr.io, and other registries
- Two-stage image cache in a dedicated Incus project (survives
down/up, avoids registry rate limits) - Local image building via Podman/Docker doc
Networking:
- Bridge networks with automatic name sanitization; external pre-existing networks
- Static IPv4/IPv6 addresses with automatic DHCP ranges doc
- Port forwarding via proxy devices or kernel NAT mode doc
Storage:
- Storage volumes with UID/GID shifting; bind mounts (pass-through by default, optional seeding) doc
- Per-volume storage pool placement - pin a database volume to your fast SSD pool doc
Operations:
- Health checks, restart policies, and
depends_on: service_healthyordering via theic-healthdsidecar doc - Service scaling with
up --scaleand orphan pruning - Incus project isolation
- Resource limits and other advanced compose features (
shm_size,container_name, etc.)
Beyond any OCI engine:
- Project-wide resource limits - cap CPU and memory for the entire stack, enforced by Incus doc
- GPU, USB, and raw disk passthrough per service via
x-incus-compose.devicesdoc - The full Incus API as an escape hatch: any instance, network, or volume option passes straight through via
x-incusdoc
Compose command parity: Most docker compose verbs map directly; the rest (images, cp, top, events, kill) are covered through the incus passthrough. Not implemented yet: run, pause/unpause, port — the full table with alternatives is in the CLI Reference.
Install:
curl -sSfL https://raw.githubusercontent.com/lxc/incus-compose/main/install.sh | sh -s -- -b ~/.local/bin
From 1.0.0-beta.16 or later, just run: incus-compose self-update
Arch users: an incus-compose-bin and incus-compose-git (maintained by @neitsab and @jochumdev) are available.
Docs: docs.incus-compose.org — getting started, CLI reference, compose compatibility (what works, what doesn’t), and architecture. Working examples — including a full Immich stack — live in the repo under examples/.
What’s next:
- healthd rewrite: Event-driven discovery via the Incus event API instead of poll-and-reload, running once per server instead of per project (#31, milestoned v1.1.0).
backupcommand: (#45)- Contributor opportunities: The parity table doubles as a contribution map.
run,pause/unpause, andportare open ground. Each is self-contained and a great first project—pick one, open an issue, and I’ll help you scope it.
Committers and co-maintainers are welcome.
Thanks to the testers who shaped this from the first betas: @Sagi (early bug fixes, the storage-pool patch), @neitsab (AUR package, IncusOS testing), @pyrodogg (service-name DNS, the bind-mount seeding critique that changed the design), @kgoetz, @edorgeville, @bburky, and @blurry (unmanaged bridges, network shares, USB/GPU devices). @bketelsen wrote the original proof-of-concept this started from. @stgraber brought the project into the lxc organization and helped with implementation details and feature work on the Incus side.
I run incus-compose in production myself: Immich, Wiki.js, LeafWiki, Gitea, Caddy, Kimai, and a DNS stack. Feedback from real-world compose projects remains the most useful thing you can send.
René
Repo: GitHub - lxc/incus-compose: Bring the familiar Docker Compose workflow to Incus — run compose.yaml files natively on Incus · GitHub
Releases: Releases · lxc/incus-compose · GitHub
Changelog: incus-compose/CHANGELOG.md at main · lxc/incus-compose · GitHub
Previous threads: early development, beta feedback
