Zum Inhalt springen

Docker-Container wird sofort beendet: Ursache finden und beheben

Mittel 15 Min. Aktualisiert:

Kurze Antwort

Wenn ein Docker-Container sofort beendet wird, prüfen Sie zuerst `docker logs` und den Exit-Code. Die häufigsten Ursachen sind ein falscher Startbefehl, eine Anwendung, die sofort beendet wird, fehlende Konfiguration oder Berechtigungen und ein Container, der keinen Vordergrundprozess hat. Korrigieren Sie den Befehl oder Entrypoint und starten Sie den Container interaktiv, um den Fehler zu sehen.

So erkennen Sie das Problem

  • `docker ps` zeigt den Container nicht an, aber `docker ps -a` führt ihn als Exited
  • Der Container startet und verschwindet innerhalb weniger Sekunden
  • In den Logs steht nichts oder nur eine Fehlermeldung beim Start
  • Die Anwendung läuft lokal, beendet sich im Container aber sofort
  • Der Exit-Code ist 0, 1, 127 oder 137

Häufigste Ursachen

Falscher Startbefehl oder Entrypoint

Wenn im Dockerfile oder im `docker run`-Befehl ein nicht existierender Befehl angegeben ist, beendet sich der Container mit Code 127. Prüfen Sie, ob der Pfad zur ausführbaren Datei korrekt ist und ob der Befehl im von Docker erwarteten Format vorliegt.

Anwendung beendet sich sofort

Der Container lebt, solange der Hauptprozess läuft. Wenn die Anwendung nur etwas ausführt und dann endet oder im Hintergrund gestartet wird, wird der Container beendet. Der Hauptprozess muss im Vordergrund bleiben.

Fehlende Konfiguration oder Berechtigung

Die Anwendung kann abstürzen, wenn Umgebungsvariablen, eine Konfigurationsdatei oder Schreibberechtigungen fehlen. In den Logs sehen Sie dann einen Startfehler, zum Beispiel dass die Datenbank nicht erreichbar ist oder eine Datei nicht existiert.

Port oder Ressourcen

Wenn der Port belegt ist, kann der Start mit der Meldung fehlschlagen, dass der Port bereits verwendet wird. Der Container kann auch beendet werden, wenn nicht genügend Speicher vorhanden ist oder der Prozess aufgrund von Limits beendet wurde.

Abhängigkeit zwischen Diensten

In einer Docker-Compose-Umgebung startet ein Container möglicherweise nicht oder wird beendet, wenn ein abhängiger Dienst nicht bereit ist. Prüfen Sie die Reihenfolge und Bedingungen in `depends_on` und verwenden Sie einen Healthcheck, um zu prüfen, ob der abhängige Dienst tatsächlich bereit ist.

Lösung Schritt für Schritt

  1. 1

    Status und Exit-Code prüfen

    Führen Sie docker ps -a aus, um alle Container einschließlich der beendeten anzuzeigen. Achten Sie auf die Spalte STATUS und den Exit-Code. Code 0 bedeutet, dass der Prozess normal beendet wurde, 1 ist ein allgemeiner Fehler, 127 ein nicht existierender Befehl und 137 deutet auf eine erzwungene Beendigung hin, oft wegen Speichermangels.

  2. 2

    Logs prüfen

    Führen Sie docker logs <Name_oder_ID> aus. Wenn der Container beendet ist, fügen Sie --tail 100 hinzu, um die letzten hundert Zeilen zu sehen. Die Logs enthalten meist den genauen Grund, zum Beispiel einen Konfigurationsfehler oder die Meldung, dass der Befehl nicht gefunden wurde.

  3. 3

    Container interaktiv starten

    Umgehen Sie den Startbefehl und gehen Sie in die Shell: docker run -it --entrypoint /bin/sh <Image>. Wenn das Image kein sh hat, versuchen Sie bash. Starten Sie die Anwendung innerhalb des Containers manuell und sehen Sie den Fehler, den Sie sonst nicht sehen.

  4. 4

    Befehl und Entrypoint prüfen

    Sehen Sie sich das Dockerfile und den docker run-Befehl an. Stellen Sie sicher, dass CMD oder ENTRYPOINT im richtigen Format vorliegen und der Pfad zur ausführbaren Datei existiert. Wenn Sie docker compose verwenden, prüfen Sie das Feld command in docker-compose.yml.

  5. 5

    Sicherstellen, dass der Hauptprozess im Vordergrund bleibt

    Die Anwendung darf nicht im Hintergrund gestartet werden oder sofort enden. Wenn es sich um ein Skript handelt, fügen Sie am Ende eine Schleife hinzu oder starten Sie einen Server, der lauscht. Für Container, die nur aktiv bleiben sollen, verwenden Sie tail -f /dev/null als vorübergehende Lösung.

  6. 6

    Umgebungsvariablen und Konfiguration prüfen

    Vergleichen Sie docker inspect <Container> mit dem, was die Anwendung erwartet. Fügen Sie fehlende Variablen über -e oder im Abschnitt environment hinzu. Prüfen Sie auch, ob Konfigurationsdateien am richtigen Pfad eingebunden sind.

  7. 7

    Berechtigungen und Eigentümer prüfen

    Wenn die Anwendung in ein Volume oder Verzeichnis schreibt, stellen Sie sicher, dass der Benutzer im Container die Berechtigung hat. Fügen Sie in docker run --user hinzu oder passen Sie das Dockerfile an. Berechtigungsfehler erscheinen oft in den Logs als Permission denied.

  8. 8

    Healthcheck und Abhängigkeiten deaktivieren

    Wenn Sie Compose verwenden, kommentieren Sie vorübergehend healthcheck und depends_on aus, um zu sehen, ob der Container eigenständig läuft. Fügen Sie sie dann einzeln wieder hinzu und beobachten Sie das Verhalten.

  9. 9

    Image neu erstellen

    Wenn Sie das Dockerfile geändert haben, führen Sie docker build --no-cache -t <Name> . aus und starten Sie den Container erneut. Ein zwischengespeicherter Layer kann eine Änderung verbergen, die die Ursache des Problems ist.

Wenn nichts hilft

Aktivieren Sie detaillierteres Logging der Anwendung und starten Sie sie mit docker run ohne -d, um die Ausgabe live zu sehen. Prüfen Sie in docker inspect (Feld State.OOMKilled), ob der Container wegen OOMKilled beendet wird. Wenn Sie Kubernetes oder einen anderen Orchestrator verwenden, sehen Sie sich die Ereignisse und den Restart-Count an. Wenn das Problem in der Anwendung selbst liegt, starten Sie sie außerhalb des Containers mit denselben Umgebungsvariablen, um Docker zu isolieren. Bei komplexen Fällen mit mehreren Diensten ist es hilfreich, eine minimale docker-compose.yml mit nur einem Dienst zu erstellen und die anderen schrittweise hinzuzufügen.

So beugen Sie vor

  • Verwenden Sie immer `docker logs` und den Exit-Code, bevor Sie etwas ändern.
  • Geben Sie im Dockerfile explizit `CMD` oder `ENTRYPOINT` an und testen Sie es lokal.
  • Bereinigen Sie gelegentlich beendete Container, ungenutzte Netzwerke und dangling Images mit `docker system prune`; prüfen Sie vor dem Ausführen, was entfernt wird, und erstellen Sie eine Sicherung wichtiger Daten.
  • Definieren Sie in der Compose-Datei einen Healthcheck und `restart: unless-stopped` für Dienste, die dauerhaft laufen sollen.

Wann Sie einen Profi rufen sollten

Wenn Sie alle Schritte ausprobiert haben und der Container immer noch ohne klaren Grund beendet wird oder wenn das Problem mehrere Dienste und eine Produktionsumgebung betrifft, wenden Sie sich an den IT-Support, um Konfiguration und Logs gemeinsam zu analysieren.

Software- und Produktentwicklung · Individuelle Apps, SaaS und ein MVP in 4 bis 8 Wochen

Häufige Fragen

Warum wird der Container mit Exit-Code 0 beendet?

Exit-Code 0 bedeutet, dass der Hauptprozess erfolgreich beendet wurde, aber das heißt auch, dass der Container nichts mehr zu tun hat. Meist wurde die Anwendung im Hintergrund gestartet oder sofort beendet. Die Lösung ist, den Hauptprozess im Vordergrund zu halten.

Wie sehe ich einen Fehler, der nicht in den Logs erscheint?

Starten Sie den Container interaktiv mit `docker run -it --entrypoint /bin/sh <Image>` und starten Sie die Anwendung manuell. So sehen Sie die Ausgabe live. Sie können den Container auch vorübergehend mit `sleep 3600` als Befehl starten, bei Bedarf mit `--entrypoint`, und dann hineingehen und testen.

Was bedeutet Exit-Code 137?

Code 137 bedeutet normalerweise, dass der Prozess gewaltsam beendet wurde, meist wegen Speichermangels (OOM). Prüfen Sie `docker inspect` und das Feld `State.OOMKilled`. Erhöhen Sie den Speicher oder optimieren Sie die Anwendung.

Teilen
Keine Lösung gefunden?Der KI-IT-Assistent ist rund um die Uhr erreichbar. Beschreiben Sie das Problem oder senden Sie einen Screenshot und erhalten Sie eine Anleitung für Ihren Fall.KI-IT-Assistent fragen