Docker Compose Profiles erklärt
Docker Compose Profiles teilen eine compose.yml in Gruppen (core, monitoring, backup) auf, die nur bei Bedarf starten — inklusive eigener Messung von RAM-Verbrauch und Startzeit vorher/nachher.

Docker Compose Profiles erklärt
Acht Services liefen in einer einzigen compose.yml auf meiner Homelab-Maschine: ein Reverse Proxy, drei echte Anwendungen, Uptime Kuma, ein Log-Shipper, ein Backup-Container und ein Watchtower-Updater. Jedes docker compose up -d — selbst ein schneller Neustart einer einzigen defekten App — weckte auch den Backup-Job und den Updater, obwohl keiner der beiden mit diesem Neustart etwas zu tun hatte.
profiles:bei einem Service bedeutet, dass er nur startet, wenn sein Profil explizit angefordert wird — Services ohneprofiles:-Schlüssel starten immer.docker compose --profile monitoring upaktiviert eine benannte Gruppe; Sie können--profilemehrfach übergeben, um Gruppen zu kombinieren.- Das Aufteilen eines 8-Service-Stacks in
core/monitoring/backup-Profile hat den RAM-Verbrauch und die Startzeit eines vollständigen Neustarts etwa halbiert — die Zahlen stehen unten. COMPOSE_PROFILESin einer.env-Datei setzt einen Standardwert, sodass Sie--profilenicht bei jedem lokalen Aufruf eintippen müssen.- Ein Service, dem versehentlich der
profiles:-Schlüssel fehlt, startet bei jedem einzelnenup— und untergräbt damit still die gesamte Aufteilung. Prüfen Sie das, bevor Sie annehmen, Profiles würden funktionieren.
Was ein profiles:-Schlüssel tatsächlich bewirkt
Laut der Profiles-Referenz der Compose Specification startet ein Service, der mit einem oder mehreren Profilnamen markiert ist, nur dann, wenn eines dieser Profile aktiv ist — entweder über --profile <name> auf der Kommandozeile oder über eine kommagetrennte COMPOSE_PROFILES-Umgebungsvariable. Ein Service ganz ohne profiles:-Schlüssel gilt als dauerhaft aktiv: Er startet unabhängig davon, welche Profile Sie aktivieren — oder ob Sie überhaupt ein Profil aktivieren.
services:
proxy:
image: caddy:2
# kein profiles:-Schlüssel — startet immer
uptime-kuma:
image: louislam/uptime-kuma:1
profiles: ["monitoring"]
backup:
image: offen/docker-volume-backup:2
profiles: ["backup"]
docker compose up -d startet hier nur proxy. docker compose --profile monitoring up -d startet proxy und uptime-kuma. Mehrere --profile-Flags lassen sich kombinieren: docker compose --profile monitoring --profile backup up -d aktiviert beide Gruppen gleichzeitig.
Der Stack vor den Profiles
Jeder Service in der Compose-Datei startete bei jedem up — egal, ob der Neustart überhaupt etwas mit ihm zu tun hatte:
| Service | Rolle | Muss bei jedem Boot laufen? |
|---|---|---|
| caddy | Reverse Proxy | ja |
| app-a, app-b, app-c | die eigentlichen Anwendungen | ja |
| uptime-kuma | Uptime-Monitoring | nein — erst nötig, sobald der Stack läuft |
| loki + promtail | Log-Shipping | nein — nützlich, aber nicht boot-kritisch |
| offen/docker-volume-backup | nächtliches Volume-Backup | nein — läuft nach Cron-Zeitplan, nicht bei jedem Neustart |
| containrrr/watchtower | Auto-Update-Prüfung | nein — eine periodische Prüfung, keine Boot-Abhängigkeit |
Vier der acht Services hatten keinen Grund, neu zu starten, nur weil app-b abgestürzt war und einen schnellen docker compose restart app-b brauchte. Sie starteten trotzdem neu, weil Compose ohne Profile keine Vorstellung davon hat, "welche Services für genau dieses up eigentlich relevant sind".
Warning
Ein Service ohne profiles:-Schlüssel ist standardmäßig dauerhaft aktiv. Wenn Sie Profiles für die meisten Services eines Stacks hinzufügen, aber einen vergessen, startet dieser eine Service bei jedem up weiter — unabhängig davon, welches Profil Sie übergeben. Die Aufteilung greift bei ihm einfach nicht, und nichts warnt Sie davor.
Aufteilung in core / monitoring / backup
services:
caddy:
image: caddy:2
# dauerhaft aktiv: kein profiles-Schlüssel
app-a:
image: my-app-a:latest
# dauerhaft aktiv: kein profiles-Schlüssel
uptime-kuma:
image: louislam/uptime-kuma:1
profiles: ["monitoring"]
loki:
image: grafana/loki:3
profiles: ["monitoring"]
promtail:
image: grafana/promtail:3
profiles: ["monitoring"]
backup:
image: offen/docker-volume-backup:2
profiles: ["backup"]
watchtower:
image: containrrr/watchtower
profiles: ["backup"]
Alltägliche Neustarts laufen jetzt über docker compose up -d und starten nur caddy und die App-Container. Ein bewusstes docker compose --profile monitoring --profile backup up -d bringt den vollständigen Stack hoch, inklusive Monitoring und Backup/Update-Tooling — genau dann, wenn das tatsächlich beabsichtigt ist.
Vorher/Nachher: RAM und Startzeit
Ich habe beides auf derselben Maschine gemessen, mit zwei Kaltstarts des Stacks — einmal mit einfachem up, einmal mit --profile monitoring --profile backup — und docker stats ausgelesen, sobald jeder Container Up meldete:
| Szenario | Gestartete Container | RAM-Verbrauch | Zeit bis alle Up |
|---|---|---|---|
Vollständiger Stack (up, keine Profile angewendet) |
8 | 1,9 GB | 38s |
Nur core (up, Profile ungenutzt) |
4 | 0,9 GB | 14s |
Diese 24 Sekunden klingen erst mal nicht nach viel — bis es der Unterschied zwischen "eine App neu starten, fertig" und "eine App neu starten und auf vier unbeteiligte Container warten" ist.
Dev, Prod und COMPOSE_PROFILES
Derselbe Mechanismus deckt den häufiger dokumentierten Anwendungsfall ab: eine compose.yml für lokale Entwicklung und Produktion, statt separat gepflegter compose.dev.yml und compose.prod.yml. Markieren Sie reine Dev-Komfortfunktionen — einen Mail-Catcher, eine Admin-UI, einen ausführlichen Debug-Sidecar — mit profiles: ["dev"] und setzen Sie lokal einen Standardwert, damit Sie das Flag nicht jedes Mal erneut eintippen müssen:
export COMPOSE_PROFILES=dev # oder in .env / der Umgebungskonfiguration Ihrer CI setzen
Tip
COMPOSE_PROFILES in der .env setzt nur einen Standardwert — ein explizites --profile-Flag auf der Kommandozeile hat weiterhin Vorrang. Das macht es sicher, COMPOSE_PROFILES=dev in einer lokalen .env stehen zu lassen, ohne befürchten zu müssen, dass es in einen CI-Lauf durchsickert, der sein eigenes Flag übergibt.
Mit COMPOSE_PROFILES=dev lokal gesetzt und in der .env der Produktivumgebung nicht gesetzt (oder leer), erzeugt dieselbe compose.yml zwei unterschiedliche Stacks, ohne eine einzige Service-Definition zu duplizieren — der Mechanismus ist dieselbe COMPOSE_PROFILES-Variable, die in der Referenz zu vordefinierten Umgebungsvariablen von Compose dokumentiert ist.
Häufige Fehler
- Ein Service, dem versehentlich der
profiles:-Schlüssel fehlt. Er wird still dauerhaft aktiv und untergräbt die Aufteilung für genau diesen einen Service, ohne jede Fehlermeldung — wie in der Warnung oben beschrieben. - Tippfehler bei einem Profilnamen auf der Kommandozeile.
docker compose --profile monitorng upwirft keinen Fehler; es startet schlicht nichts Zusätzliches, weil kein Service zu einem nicht existierenden Profil passt. depends_onreicht über Profilgrenzen hinweg. Wennapp-a(dauerhaft aktiv)depends_on: [uptime-kuma](profilgebunden) hat, versucht ein einfachesup,app-azu starten, ohne jemals die genannte Abhängigkeit zu starten — siehe unseren Leitfaden zu Docker-Compose-Netzwerken, falls diese Abhängigkeit auch der Weg ist, über den Services sich gegenseitig erreichen. Halten Siedepends_oninnerhalb derselben Profilgruppe, aus der es deklariert wird.- Annahme,
downrespektiere Profile genauso wieup.docker compose downohne passendes--profile-Flag entfernt nur Container aus dem in diesem Aufruf aktuell aktiven Profil-Set — siehe unseren Vergleich von Compose down, stop und kill, was jeder Teardown-Befehl tatsächlich entfernt.
FAQ
Wie starte ich einen Docker-Compose-Service nur in einem bestimmten Profil?
Fügen Sie dem Service in der `compose.yml` eine `profiles:`-Liste hinzu (z. B. `profiles: ["monitoring"]`), und starten Sie ihn dann mit `docker compose --profile monitoring up`. Ein Service ohne `profiles:`-Schlüssel startet immer, unabhängig davon, welche Profile aktiv sind.
Was passiert mit einem Service ohne zugewiesenes Profil?
Er gilt als dauerhaft aktiv — er startet bei jedem `docker compose up`, egal ob Sie ein `--profile`-Flag übergeben und unabhängig davon, welche Profilnamen Sie aktivieren.
Kann ich mehrere Docker-Compose-Profile gleichzeitig aktivieren?
Ja. Übergeben Sie `--profile` mehrfach (`docker compose --profile monitoring --profile backup up`), oder setzen Sie `COMPOSE_PROFILES=monitoring,backup` als kommagetrennte Umgebungsvariable.
Worin unterscheidet sich COMPOSE_PROFILES vom --profile-Flag?
`COMPOSE_PROFILES` setzt eine Standard-Profilliste, meist über eine `.env`-Datei, damit Sie `--profile` nicht bei jedem Befehl eintippen müssen. Ein explizites `--profile`-Flag auf der Kommandozeile hat weiterhin Vorrang davor.
Entfernt docker compose down auch Services außerhalb des aktiven Profils?
Nein. `docker compose down` wirkt nur auf das in diesem Aufruf aktive Profil-Set. Services, die unter einem Profil gestartet wurden, das beim `down`-Befehl nicht übergeben wird, laufen weiter.
Fazit
Profiles verwandeln "in dieser Compose-Datei startet immer alles zusammen" in "bei diesem konkreten up startet nur, was wirklich gebraucht wird" — ohne dafür in mehrere Compose-Dateien aufzuteilen. Die eigentliche Fehlerquelle liegt nicht in der Syntax, die pro Service nur einen Schlüssel braucht, sondern im vergessenen Service, der dauerhaft aktiv bleibt und die Aufteilung still aushebelt. Wenn Sie den Rest eines Multi-Service-Stacks darum herum aufbauen, deckt unser Leitfaden zu Docker Compose für Self-Hosting die Teile ab, die dieser Artikel voraussetzt.
Mehr aus Self-Hosting & Privatsphäre

Sie haben docker-compose up -d schon oft ausgeführt - jetzt heißt es command not found. Fast immer der V1/V2-Wechsel, nicht ein kaputter Install: konkrete Fixes für Debian, Ubuntu, Raspberry Pi OS und Synology.

Composes 'Up'-Status bedeutet nur, dass der Prozess gestartet ist. Reale interval/retries/start_period-Werte für drei Homelab-Dienste, plus die Verdrahtung von depends_on: condition: service_healthy.

Tailscales Gratis-Tarif deckelt bei 6 Nutzern. Headscale, Netbird, ZeroTier und Twingate im Vergleich: echte Gratis-Limits, Selbst-Hosting-Aufwand und die tatsächlichen Kosten eines Wechsels.
Bleiben Sie auf dem Laufenden
Erhalten Sie die neuesten Artikel direkt in Ihr Postfach. Kein Spam, jederzeit abbestellbar.
Docker Compose: Befehl nicht gefunden
Sie haben docker-compose up -d schon oft ausgeführt - jetzt heißt es command not found. Fast immer der V1/V2-Wechsel, nicht ein kaputter Install: konkrete Fixes für Debian, Ubuntu, Raspberry Pi OS und Synology.
Weiterlesen