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.