--- name: docker-compose-config description: Docker Compose configuration management for multi-host server deployments. Use when creating, modifying, or managing docker-compose.yml files with environment-specific configurations, external volume mounts, and reverse proxy networks. Triggers on tasks involving Docker Compose files, environment overrides, multi-host deployments, or service configuration for self-hosted applications. --- # Docker Compose Configuration Management This skill provides guidance for managing Docker Compose configurations across multiple server environments with per-host overrides. ## Directory Structure Each project follows this structure: ``` /docker/config/ ├── / │ ├── docker-compose.yml # Main service definitions │ ├── docker-compose.override.yml # Current host overrides (gitignored) │ ├── .env # Environment variables (gitignored) │ └── environments/ │ └── / # Per-host configs │ ├── .env │ └── docker-compose.override..yml ``` ## Compose File Conventions ### Service Definition Pattern ```yaml name: services: : container_name: image: /: environment: PUID: ${UID} PGID: ${GID} # Service-specific vars use env substitution VAR_NAME: ${VAR_NAME} volumes: - ${DATA_PATH}:/app/data - /etc/localtime:/etc/localtime:ro ports: - ${SERVICE_PORT:-default}:internal_port restart: unless-stopped networks: - default - reverse_proxy networks: reverse_proxy: name: reverse_proxy attachable: true ``` ### Key Patterns 1. **Image versioning**: Always use pinned version tags (never `latest`) ```yaml image: ghcr.io/org/image:v1.0.0 image: lscr.io/linuxserver/app:2.5.1 ``` Note: SHA256 digests are managed automatically by Renovate bot and should not be added manually. 2. **Port defaults**: Always provide defaults for ports ```yaml ports: - ${APP_PORT:-8080}:8080 ``` 3. **Volume mounts**: Use environment variables for paths ```yaml volumes: - ${UPLOAD_LOCATION}:/usr/src/app/upload - ${DB_DATA_LOCATION}/data:/var/lib/postgresql/data ``` 4. **Proxy network**: Services needing reverse proxy access join `reverse_proxy` network ```yaml networks: - default - reverse_proxy networks: reverse_proxy: name: reverse_proxy attachable: true ``` ## Environment File Conventions ### Structure (.env) ```bash # Permissions UID=1000 GID=1000 # Paths UPLOAD_LOCATION=/mnt/user/pictures DB_DATA_LOCATION=/mnt/user/appdata/ # Ports APP_PORT=8080 # Secrets DB_PASSWORD= # Database DB_HOSTNAME=database DB_USERNAME=postgres DB_DATABASE_NAME= ``` ### Per-Host Variations - `environments//.env` overrides paths for specific hosts - Common overrides: mount paths (`/mnt/user/` vs `/mnt/main/`), ports ## Common Commands ```bash # Start a project docker compose -f /docker-compose.yml up -d # Start with host-specific override docker compose -f /docker-compose.yml \ -f /environments//docker-compose.override..yml up -d # View logs docker compose -f /docker-compose.yml logs -f # Stop services docker compose -f /docker-compose.yml down ``` ## Adding a New Host Environment 1. Create `environments//` directory 2. Copy existing host's `.env` as template 3. Update paths and port mappings for the host 4. Create override compose file if device mappings differ ## Service Dependencies Use `depends_on` with health checks for proper startup order: ```yaml depends_on: database: condition: service_healthy ``` ## Healthchecks ```yaml healthcheck: test: ["CMD", "curl", "-f", "http://127.0.0.1:8080/"] start_period: 5m interval: 30s timeout: 20s retries: 10 ``` ## References - See [examples.md](references/examples.md) for complete service configurations - See [networks.md](references/networks.md) for network topology details