Überarbeitet am 9. September 2026.

Bei Docker muss ich erstaunlich oft „mal eben in einen Container rein“: eine Konfiguration kontrollieren, einen OCC-Befehl in Nextcloud ausführen, eine Datei ansehen oder etwas zum Debuggen aus dem Container kopieren.

Dafür sind vor allem zwei Befehle praktisch: docker compose exec und docker compose cp.

Erst prüfen, welche Services laufen

Im Verzeichnis mit der compose.yaml:

docker compose ps

Wichtig ist der Service-Name aus der Compose-Datei, beispielsweise app, db oder wordpress.

Einen Befehl in einem laufenden Container ausführen

Die Grundform lautet:

docker compose exec SERVICE BEFEHL

Beispielsweise Dateien im WordPress-Container anzeigen:

docker compose exec wordpress ls -lah /var/www/html

Oder die PHP-Version prüfen:

docker compose exec wordpress php -v

Eine Shell im Container öffnen

Viele Images haben bash:

docker compose exec wordpress bash

Schlanke Alpine-Images besitzen häufig nur sh:

docker compose exec SERVICE sh

Compose reserviert bei exec standardmäßig ein TTY. Das unterscheidet sich vom klassischen docker exec, bei dem für eine interaktive Shell meist -it verwendet wird.

Als bestimmter Benutzer ausführen

Gerade bei Webanwendungen möchte ich Befehle nicht unnötig als root starten. Compose unterstützt -u beziehungsweise --user.

Bei Nextcloud zum Beispiel:

docker compose exec -u www-data app php occ status

Das ist für OCC-Kommandos meist die passendere Variante als root.

Arbeitsverzeichnis festlegen

Mit -w kann ich das Verzeichnis für den einzelnen Befehl setzen:

docker compose exec -w /var/www/html wordpress pwd

Befehle mit Pipes oder &&

Wenn Shell-Syntax wie &&, Pipes oder Umleitungen verwendet werden soll, muss eine Shell sie auswerten:

docker compose exec wordpress sh -c 'cd /var/www/html && ls -lah'

Das ist sauberer, als eine komplette verkettete Befehlszeile als vermeintlich einzelnes Programm an exec zu übergeben.

Datei aus einem Compose-Service auf den Host kopieren

Heute muss ich dafür nicht einmal den automatisch generierten Container-Namen kennen:

docker compose cp wordpress:/var/www/html/wp-config.php ./wp-config.php

Damit landet die Datei im aktuellen Verzeichnis des Hosts.

Datei vom Host in den Container kopieren

docker compose cp ./test.txt wordpress:/tmp/test.txt

Vor dem Überschreiben produktiver Konfigurationen würde ich aber immer erst die vorhandene Datei sichern und Berechtigungen kontrollieren.

Ganze Verzeichnisse kopieren

Auch Ordner funktionieren:

docker compose cp wordpress:/var/www/html/wp-content ./wp-content-backup

Für echte Backups sind cp-Befehle allerdings nicht automatisch die richtige Lösung. Datenbanken, Volumes und laufende Anwendungen brauchen ein konsistentes Backup-Konzept.

Klassisches docker exec bleibt nützlich

Wenn ein Container nicht über das aktuelle Compose-Projekt angesprochen werden soll, funktioniert weiterhin:

docker exec -it CONTAINER sh

Container-Namen zeigt:

docker ps

Für Compose-Stacks finde ich den Service-Namen aber angenehmer, weil ich mich nicht um Namen wie projekt-wordpress-1 kümmern muss.

docker cp funktioniert sogar bei gestoppten Containern

Der klassische docker cp-Befehl kann Dateien auch zwischen Host und einem gestoppten Container kopieren. exec benötigt dagegen selbstverständlich einen laufenden Container, weil darin ein neuer Prozess gestartet wird.

Nicht jede Änderung gehört direkt in den Container

Ein häufiger Fehler beim Debuggen: Konfigurationsdatei im laufenden Container ändern, Problem lösen – und beim nächsten docker compose up oder Image-Update ist alles wieder weg.

Dauerhafte Konfiguration gehört deshalb normalerweise in:

  • die compose.yaml,
  • Umgebungsvariablen,
  • Volumes oder Bind Mounts,
  • oder ein eigenes Image/Dockerfile.

exec ist hervorragend zum Prüfen und Debuggen, aber kein Ersatz für reproduzierbare Konfiguration.

Passende Docker-Grundlagen

Wenn du Compose noch nicht so gut kennst, passen dazu meine Artikel Docker Compose erklärt und Docker-Container für Einsteiger verwalten.

Fazit

Für meinen Docker-Alltag reichen häufig schon drei Befehle: docker compose ps zum Orientieren, docker compose exec für Befehle im laufenden Service und docker compose cp für Dateien. Das ist 2026 deutlich angenehmer als die alte Mischung aus docker-compose exec und manuell herausgesuchten Container-Namen.

Quellen: Docker Docs: compose exec und Docker Docs: compose cp.