2017-06-14 2 views
3

Um einen tieferen Einblick in Docker zu bekommen, habe ich eine Docker-Datei erstellt, die ein Python-Skript ausführt. Es funktioniert gut, aber nach der Ausführung des Skripts stürzt der Container ab. Wie kann ich meine Docker-Datei ändern, um den Container nach der Ausführung zu zerstören, anstatt den Container abstürzen zu lassen und ständig neu zu starten?Stoppen Sie einen Docker-Container nach der Ausführung von Code

Dockerfile:

FROM python:3 

ADD aa.py/

CMD [ "python", "./aa.py" ] 

Python:

print('Hello!') 

Fehlermeldung:

2017-06-14 11:37:09 [CELL/0] OUT Starting health monitoring of container 
2017-06-14 11:37:09 [APP/PROC/WEB/0] OUT Hello! 
2017-06-14 11:37:09 [APP/PROC/WEB/0] OUT Exit status 0 
2017-06-14 11:37:09 [CELL/0] OUT Exit status 143 
2017-06-14 11:37:09 [CELL/0] OUT Destroying container 
2017-06-14 11:37:09 [API/0] OUT Process has crashed with type: "web" 
2017-06-14 11:37:09 [API/0] OUT App instance exited with guid 6fdede46-6751-4725-ad78-b76262dbe701 payload: {"instance"=>"", "index"=>0, "reason"=>"CRASHED", "exit_description"=>"2 error(s) occurred:\n\n* 2 error(s) occurred:\n\n* Codependent step exited\n* cancelled\n* cancelled", "crash_count"=>4, "crash_timestamp"=>1497433029411246770, "version"=>"98e2a035-e38f-4169-95fb-2701c8486e9c"} 
2017-06-14 11:37:09 [CELL/0] OUT Successfully destroyed container 
2017-06-14 11:38:31 [CELL/0] OUT Creating container 
+0

Wie haben Sie Ihren Container gestartet? Sie können 'docker run --rm mypython' verwenden, das Ihren Container nach dem Ausführen des Skripts entfernt. – lvthillo

+0

Ich benutze Docker auf CloudFoundry. Über die Benutzeroberfläche tippte ich einen Docker Hub Repo ein und startete es. – user3080315

+0

Ich habe noch nie Cloudfundry benutzt, kann dir also nicht helfen. Ich würde vermuten, dass es versucht, wegen cf neu zu starten, weil nur im Andockfenster dieser Behälter laufen wird, die Nachricht anzeigen und stoppen. Die Option '--rm 'entfernt den Container nach dem Lauf. Ich kann dir nicht helfen, dies zu reproduzieren, vgl. – lvthillo

Antwort

2

Hinweis: Die Standard-CMD for python:3 is python3.

exit code 143 means SIGTERM als mentioned here. Das ist what docker sends.
So müssen Sie für Ihre python3 application to process SIGTERM signal gracefully

Vergessen Sie nicht, dass Ihre Python-Anwendung, einmal abgeschlossen und verlassen die Hauptfunktion, würde bewirken, dass der Behälter automatisch und Ausfahrt stoppen.

The OP fügt in the comments:

In der Zwischenzeit habe ich, dass in der Docker Umgebung die SIGTERM Entladearbeiten völlig in Ordnung herausgefunden.

Die Verwendung des gleichen Codes in Docker on CloudFoundry verhindert jedoch nicht den Absturz des Containers.
In CloudFoundry benötigen Sie eine Anwendung, die immer ausgeführt wird und nicht nur eine Aufgabe ausführt und dann stoppt wie ein Skript.
Auch das Beenden ohne Fehler wird in CloudFoundry als Absturz erkannt.

Ich habe mein Skript in einen REST-Server umgewandelt, indem ich das flask-Framework verwendete. Jetzt läuft es immer, aber nur wenn es über seine URL aufgerufen wird.

+0

Danke. Wann wird das Signal gesendet? Sobald das Skript ausgeführt wurde? – user3080315

+0

Ich habe die Lösungen ausprobiert, aber nach dem Umgang mit dem SIGTERM stürzt es wieder ab. – user3080315

+0

@ user3080315 Das Signal wird gesendet, wenn der Hauptprozess beendet und der Container gestoppt wird. Wenn Ihre Anwendung es nicht korrekt verarbeitet, können Sie mit Zombie-Prozessen belassen werden (https://StackOverflow.com/a/33119321/6309). Deshalb, mit docker 1.13 oder mehr, hast du 'docker run --init': https://stackoverflow.com/a/39593409/6309 – VonC

Verwandte Themen