Ü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.
Gedanken dazu 0 Kommentare
Noch ist es ruhig hier. Dein Gedanke könnte der erste sein.
Was denkst du dazu?
Dein Kommentar erscheint nach der Freigabe.