A Rust implementation of Docker Host Manager - automatically update /etc/hosts with container hostnames.
- π Event-driven: Listens to Docker events and updates hosts file in real-time
- π Socket support: Connects to Docker Engine via Unix socket
- π Network-aware: Supports Docker networks with proper hostname resolution
- π·οΈ Flexible naming:
- Container name + network name (e.g.,
web.myapp) - Network aliases
- Custom domains via
DOMAIN_NAMEenvironment variable - Custom domains via
dev.orbstack.domainslabel (OrbStack compatible) - Format:
DOMAIN_NAME=network:hostnameorDOMAIN_NAME=domain1.com,domain2.com
- Container name + network name (e.g.,
- π¨ Nice CLI UX: Colored output, verbose mode, clear status messages
- π Safe by default: Watch mode displays changes without writing to files
- β‘ Fast: Written in Rust for performance and reliability
Download the latest release for your platform from the releases page:
# Linux (x86_64)
curl -L https://github.com/dkarlovi/docker-hostmanager.rs/releases/latest/download/docker-hostmanager-VERSION-linux-amd64.tar.gz | tar xz
sudo mv docker-hostmanager-VERSION-linux-amd64/docker-hostmanager /usr/local/bin/
# macOS (Apple Silicon)
curl -L https://github.com/dkarlovi/docker-hostmanager.rs/releases/latest/download/docker-hostmanager-VERSION-macos-arm64.tar.gz | tar xz
sudo mv docker-hostmanager-VERSION-macos-arm64/docker-hostmanager /usr/local/bin/cargo build --release
sudo cp target/release/docker-hostmanager /usr/local/bin/
# or
make installdocker run -d \
--name docker-hostmanager \
--restart=always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /etc/hosts:/etc/hosts \
ghcr.io/dkarlovi/docker-hostmanager.rs:latest \
sync /etc/hosts# Short version
docker-hostmanager --version
# Output: docker-hostmanager v1.0.0
# Detailed version
docker-hostmanager version
# Output: dkarlovi/docker-hostmanager v1.0.0Watch mode displays hostname changes without modifying any files. Perfect for testing and development.
# Watch mode (default command)
docker-hostmanager
# or explicitly
docker-hostmanager watch
# Watch once and exit
docker-hostmanager watch --once
# Verbose output
docker-hostmanager watch -vSync mode updates the hosts file with container hostnames. Requires a path to the hosts file.
# Sync to hosts file (requires sudo for /etc/hosts)
sudo docker-hostmanager sync /etc/hosts
# Sync once and exit
sudo docker-hostmanager sync /etc/hosts --once
# Custom TLD
sudo docker-hostmanager sync /etc/hosts -t .local
# Custom Docker socket
docker-hostmanager sync /tmp/hosts -s unix:///custom/docker.sockAll command-line options can be set via environment variables:
TLD: Top-level domain for containers without networks (default:.docker)DOCKER_SOCKET: Docker socket path (default:unix:///var/run/docker.sock)DEBOUNCE_MS: Debounce delay in milliseconds before writing (default:100)
export TLD=.local
export DEBOUNCE_MS=200
docker-hostmanager sync /tmp/hostsWhen multiple containers start at once (e.g., docker-compose up), the tool debounces writes to avoid updating the hosts file multiple times in rapid succession. By default, it waits 100ms after the last container event before writing.
# Use a longer debounce (500ms)
docker-hostmanager sync /etc/hosts --debounce-ms 500
# Or via environment variable
export DEBOUNCE_MS=500
docker-hostmanager sync /etc/hostsThis ensures that when a stack of containers boots up, the hosts file is only written once with all the new entries.
The tool generates hostnames based on container configuration:
-
Containers with networks (Docker Compose v2+):
- Format:
{container_name}.{network_name} - Example: Container
webin networkmyappβweb.myapp - Network aliases are also included:
{alias}.{network_name}
- Format:
-
Containers without networks (bridge mode):
- Format:
{container_name}{tld} - Example: Container
nginxwith TLD.dockerβnginx.docker
- Format:
-
Custom domains via
DOMAIN_NAMEenvironment variable:- Simple format:
DOMAIN_NAME=domain1.com,domain2.com - Network-specific:
DOMAIN_NAME=myapp:api.local,myapp:admin.local
- Simple format:
-
Custom domains via
dev.orbstack.domainslabel (OrbStack compatible):- Format:
dev.orbstack.domains=foo.local,bar.local - Unlike OrbStack, this implementation doesn't restrict TLDs to
.local
- Format:
version: '3.5'
networks:
myapp:
name: myapp
services:
web:
image: nginx
networks:
myapp:
aliases:
- www
environment:
- DOMAIN_NAME=myapp:api.local
labels:
dev.orbstack.domains: "app.example.com,www.example.com"
db:
image: postgres
networks:
myapp:
aliases:
- databaseThis will create the following hosts entries:
# In /etc/hosts:
## docker-hostmanager-start
172.18.0.2 web.myapp www.myapp api.local app.example.com www.example.com
172.18.0.3 db.myapp database.myapp
## docker-hostmanager-end
cargo build
# or
make build# Watch mode (see output without writing)
cargo run
# Sync mode (write to a test hosts file)
cp /etc/hosts /tmp/hosts
cargo run -- sync /tmp/hosts -vcargo test
# or
make test# Run Clippy
cargo clippy --all-targets --all-features -- -D warnings
# or
make clippy
# Run all checks (tests + clippy)
make checkThis Rust rewrite provides:
- β Better performance (native binary vs PHP interpreter)
- β Lower memory footprint
- β Easier deployment (single binary vs PHP + dependencies)
- β Type safety and reliability
- β Modern CLI with colored output
- β Better error messages
MIT
Inspired by the original docker-hostmanager PHP project by Luc Vieillescazes.