docker exec - in laufende Container schauen und Befehle ausführen
docker exec - in laufende Container schauen und Befehle ausführen
docker exec ist das wichtigste Werkzeug zur Fehlersuche — damit lassen sich Befehle in laufenden Containern ausführen, ohne sie neu zu starten.
Interaktive Shell öffnen
docker exec -it <container> bash # Bash, falls verfügbar
docker exec -it <container> sh # Fallback für Alpine und andere
-i hält stdin offen, -t allokiert ein Pseudo-Terminal. Beide Flags zusammen geben eine interaktive Shell.
Den Container-Namen aus docker ps ablesen:
docker ps --format "table {{.Names}}\t{{.Image}}\t{{.Status}}"
Einzelne Befehle ausführen
Ohne Shell — direkt einen Befehl im Container:
docker exec myapp cat /etc/hosts
docker exec myapp env | sort
docker exec myapp ls -la /app/data
Als anderen Benutzer ausführen
docker exec -u root myapp id # Als root
docker exec -u www-data nginx whoami # Als www-data
docker exec -u 1000 myapp ls -la /home/app
Nützlich, wenn der Container normalerweise als eingeschränkter User läuft, man aber für Debugging Root-Rechte braucht.
Nützliche Debugging-Patterns
Laufende Prozesse:
docker exec myapp ps aux
Umgebungsvariablen prüfen:
docker exec myapp env
docker exec myapp printenv DB_HOST
Netzwerk-Konnektivität testen:
docker exec myapp ping db # Andere Container per Name erreichbar?
docker exec myapp curl -s http://api:3000/health
docker exec myapp wget -qO- http://example.com
Dateiinhalt lesen:
docker exec myapp cat /etc/nginx/nginx.conf
docker exec myapp tail -f /var/log/app.log
Datenbankabfrage direkt ausführen:
docker exec -it postgres psql -U postgres -d mydb -c "SELECT count(*) FROM users;"
docker exec -it mysql mysql -u root -psecret mydb -e "SHOW TABLES;"
docker exec -it redis redis-cli KEYS "*"
Disk-Belegung prüfen:
docker exec myapp df -h
docker exec myapp du -sh /app/uploads
Arbeitsverzeichnis setzen
docker exec -w /app myapp ls -la # Befehl in /app ausführen
exec vs. attach
Beide Befehle verbinden mit einem laufenden Container, aber anders:
| | docker exec | docker attach |
|---|---|---|
| Startet neuen Prozess | Ja | Nein |
| Verbindet mit PID 1 | Nein | Ja |
| Ctrl+C beendet Container | Nein | Ja |
| Für Debugging geeignet | Ja | Selten |
docker attach verbindet mit dem Hauptprozess (PID 1) des Containers. Ctrl+C sendet SIGINT an diesen Prozess und kann den Container beenden — in der Regel nicht das, was man will. exec startet immer einen neuen Prozess.
exec in Compose
docker compose exec app bash # Service-Name statt Container-Name
docker compose exec -u root db psql -U postgres
Bei Compose-Stacks ist der Service-Name meistens einfacher als den vollen Container-Namen zu tippen.
Wenn bash nicht verfügbar ist
Alpine-Images haben nur sh:
docker exec -it myapp sh
Oder Tools nachinstallieren (temporär, geht nach Container-Neustart verloren):
docker exec -u root myapp apk add --no-cache curl
docker exec ist unverzichtbar für die tägliche Arbeit mit Containern — wer Probleme reproduzieren und verstehen will, kommt daran nicht vorbei.