Mehrere Compose-Dateien kombinieren - das Override-Pattern

Mehrere Compose-Dateien kombinieren - das Override-Pattern

Docker Compose kann mehrere Dateien zusammenführen — das ermöglicht saubere Trennung zwischen Basis-Konfiguration und umgebungsspezifischen Anpassungen.

Das automatische Override

Wenn im selben Verzeichnis eine docker-compose.override.yml liegt, lädt Compose sie automatisch beim up-Befehl:

docker compose up   # Lädt docker-compose.yml + docker-compose.override.yml automatisch

Das Basis-File bleibt produktionsfähig, die Override-Datei fügt lokale Anpassungen hinzu — ohne das Basis-File anzufassen.

Manuelle Dateiangabe mit -f

Für mehr Kontrolle oder abweichende Dateinamen:

docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d
docker compose -f docker-compose.yml -f docker-compose.test.yml run tests

Die Reihenfolge ist entscheidend: spätere Dateien überschreiben frühere.

Praxisbeispiel: Dev vs. Prod

docker-compose.yml (Basis, produktionstauglich):

services:
  app:
    image: myapp:${APP_VERSION}
    environment:
      APP_ENV: production
    restart: unless-stopped

  db:
    image: postgres:16
    volumes:
      - db-data:/var/lib/postgresql/data

volumes:
  db-data:

docker-compose.override.yml (nur lokal, nicht committen oder als Vorlage):

services:
  app:
    build: .          # Lokal aus Quellcode bauen statt Image ziehen
    environment:
      APP_ENV: development
      DEBUG: "true"
    ports:
      - "8080:8080"   # Port nur lokal exponieren
    volumes:
      - .:/app        # Hot-Reload: lokaler Code gemountet

  db:
    ports:
      - "5432:5432"   # DB lokal direkt erreichbar für Tools wie DBeaver

Merge-Verhalten verstehen

Compose führt Dateien nicht blind zusammen — es gibt klare Regeln:

Skalare werden überschrieben:

# Basis: image: myapp:1.0
# Override: image: myapp:dev
# Ergebnis: image: myapp:dev

Listen werden angehängt:

# Basis: ports: ["80:80"]
# Override: ports: ["8080:8080"]
# Ergebnis: ports: ["80:80", "8080:8080"]

Maps (environment, labels) werden gemergt:

# Basis: environment: {APP_ENV: prod}
# Override: environment: {DEBUG: true}
# Ergebnis: environment: {APP_ENV: prod, DEBUG: true}

Weitere Anwendungsfälle

Monitoring-Sidecar hinzufügen:

# docker-compose.monitoring.yml
services:
  prometheus:
    image: prom/prometheus
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
    ports:
      - "9090:9090"
docker compose -f docker-compose.yml -f docker-compose.monitoring.yml up -d

Lokales SSL:

# docker-compose.ssl.yml
services:
  app:
    environment:
      HTTPS_CERT: /certs/local.crt
    volumes:
      - ./certs:/certs:ro

Tipp: Konfiguration prüfen vor dem Start

docker compose -f docker-compose.yml -f docker-compose.override.yml config

Zeigt die zusammengeführte Konfiguration — nützlich zur Fehlersuche, bevor man Container startet.

Das Override-Pattern hält Basis-Konfigurationen sauber und produkionstauglich, während lokale Entwicklungsanpassungen sauber getrennt bleiben.