Orbitd
A lightweight, set-and-forget container update daemon for Docker.
Orbitd monitors your containers and automatically updates them when new images are available, preserving all configuration, networks, volumes, and labels.
Features
- Zero Configuration: Works out of the box with sensible defaults
- Automatic Rollback: Restores previous container on update failure
- Flexible Policies: Digest-only or semantic versioning (patch/minor/major)
- Label Control: Opt-in or opt-out specific containers
- Image Cleanup: Removes old images after successful updates
Quick Start
services:
orbitd:
image: ghcr.io/mizuchilabs/orbitd:latest
container_name: orbitd
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
That's it. Orbitd will check all containers every 12 hours and update them when new digests are available.
Since v0.1.9, you can also run orbitd in docker swarm:
services:
orbitd:
image: ghcr.io/mizuchilabs/orbitd:latest
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
deploy:
replicas: 1
placement:
constraints:
- node.role == manager
Configuration
All settings are optional. Configure via environment variables or CLI flags:
| Environment Variable |
CLI Flag |
Default |
Description |
ORBITD_INTERVAL |
--interval |
12h |
Check frequency (e.g., 5m, 1h) |
ORBITD_POLICY |
--policy |
digest |
Update policy (see below) |
ORBITD_CLEANUP |
--cleanup |
true |
Remove old images after updates |
ORBITD_REQUIRE_LABEL |
--require-label |
false |
Only update labeled containers |
ORBITD_DEBUG |
--debug |
false |
Enable verbose logging |
Update Policies
| Policy |
Behavior |
Example |
digest |
Same tag, new digest (default) |
nginx:1.25 → latest build |
patch |
Patch versions only |
1.2.3 → 1.2.9 |
minor |
Minor + patch versions |
1.2.3 → 1.9.0 |
major |
Any newer version |
1.2.3 → 2.0.0 |
Semver policies require valid semver tags. Non-semver tags fall back to digest updates.
Container Labels
By default, orbitd monitors all running containers. Use ORBITD_REQUIRE_LABEL=true to switch to opt-in mode, where only containers with orbitd.enable=true are monitored.
You can also override the update policy per container with orbitd.policy:
services:
# Opt-in to monitoring (required when require-label is enabled)
app:
image: myapp:latest
labels:
- "orbitd.enable=true"
# Override policy for this container
api:
image: myapi:1.0.0
labels:
- "orbitd.enable=true"
- "orbitd.policy=minor"
# Not monitored (no label)
database:
image: postgres:15
Installation
Docker (recommended)
docker run -d \
--name orbitd \
--restart unless-stopped \
-v /var/run/docker.sock:/var/run/docker.sock:ro \
ghcr.io/mizuchilabs/orbitd:latest
Binary
Download from releases and run:
./orbitd start
License
Apache 2.0 License - see LICENSE for details
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.