Compose-Profile - Dienste situationsabhängig ein- und ausblenden

Compose-Profile - Dienste situationsabhängig ein- und ausblenden

Mit Profilen lässt sich steuern, welche Dienste bei welchem Aufruf gestartet werden — ohne mehrere Compose-Dateien zu pflegen.

Grundkonzept

Dienste ohne profiles: starten immer. Dienste mit profiles: starten nur, wenn das passende Profil aktiv ist:

services:
  app:
    image: myapp        # Kein Profil — startet immer

  db:
    image: postgres:16  # Kein Profil — startet immer

  mailhog:
    image: mailhog/mailhog
    profiles:
      - dev             # Nur bei: docker compose --profile dev up

  phpmyadmin:
    image: phpmyadmin
    profiles:
      - dev
    environment:
      PMA_HOST: db

Profile aktivieren

# Nur Basisdienste
docker compose up -d

# Mit dev-Tools
docker compose --profile dev up -d

# Mehrere Profile gleichzeitig
docker compose --profile dev --profile monitoring up -d

COMPOSE_PROFILES Umgebungsvariable

Profile lassen sich auch über eine Umgebungsvariable setzen — praktisch für CI-Systeme oder lokale .env-Dateien:

# In der Shell
export COMPOSE_PROFILES=dev,monitoring
docker compose up -d

# Oder in der .env-Datei
COMPOSE_PROFILES=dev

Praxisbeispiel: Dev-Tooling

services:
  app:
    image: myapp
    ports:
      - "8080:8080"
    depends_on:
      - db

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

  # Nur im dev-Profil: lokaler SMTP-Fake
  mailhog:
    image: mailhog/mailhog
    profiles: [dev]
    ports:
      - "8025:8025"   # Web-UI für empfangene Mails

  # Nur im debug-Profil: DB-Admin
  phpmyadmin:
    image: phpmyadmin
    profiles: [debug]
    environment:
      PMA_HOST: db
    ports:
      - "8081:80"

  # Monitoring optional
  grafana:
    image: grafana/grafana
    profiles: [monitoring]
    ports:
      - "3000:3000"

volumes:
  db-data:

Mehrere Profile pro Dienst

Ein Dienst kann in mehreren Profilen enthalten sein:

services:
  adminer:
    image: adminer
    profiles:
      - dev
      - debug    # Startet bei --profile dev ODER --profile debug

Profile und depends_on

Wenn ein Dienst ohne Profil von einem Dienst mit Profil abhängt, muss das Profil aktiv sein — sonst schlägt der Start fehl. Umgekehrt können Dienste mit Profil von Diensten ohne Profil abhängen:

services:
  db:
    image: postgres:16

  seed:
    image: myapp
    command: ["python", "seed.py"]
    profiles: [dev]
    depends_on:
      - db    # db hat kein Profil — kein Problem

Kombination mit Override-Dateien

Profile und Override-Dateien ergänzen sich gut: Profile schalten Dienste ein/aus, Override-Dateien passen Konfiguration an. Für einfache Fälle reichen Profile allein.

# Alle dev-Dienste inklusive Profil-Dienste
docker compose --profile dev up -d

# Prüfen welche Dienste aktiv wären
docker compose --profile dev config --services

Profile halten das Compose-File als einzige Quelle der Wahrheit, ohne dass man zwischen mehreren Dateien jonglieren muss.