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.