docker laufen Sie ein shell-script im hintergrund, ohne den container
Ich versuche zu laufen Sie ein shell-Skript in meine docker-container. Das problem ist, dass das shell-Skript erzeugt einen anderen Prozess und sollte es auch weiterhin laufen, es sei denn, eine andere shutdown-Skript wird verwendet, um die Prozesse beenden, die erzeugt werden, durch das startup-Skript.
Wenn ich führen Sie den nachstehenden Befehl,
docker run image:tag /bin/sh /root/my_script.sh
dann,
docker ps -a
Sehe ich, dass der Befehl beendet wurde. Aber das ist nicht das, was ich will. Meine Frage ist, wie damit der Befehl im hintergrund laufen, ohne es zu beenden?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sie haben nicht erklärt, warum Sie wollen, um zu sehen, Ihre container zu laufen, nachdem Ihr Skript beendet wurde, oder ob Sie erwarten Ihr Skript zu beenden.
Einen docker-container beendet, sobald der container
CMD
beendet. Wenn Sie möchten, dass Ihre container weiter ausgeführt wird, müssen Sie einen Prozess laufen zu halten. Eine Möglichkeit ist, einfach eine while-Schleife am Ende des Skripts:Ihr Skript wird nie beendet, so dass der container laufen zu halten. Wenn Sie Ihren container hostet ein Netzwerk-Dienst (z.B. ein web-server, Datenbank-server, etc), dann ist dies in der Regel der Prozess, der ausgeführt wird, für die Lebensdauer des Containers.
Wenn Sie stattdessen Ihr Skript beendet unerwartet, werden Sie wahrscheinlich benötigen, um einen Blick auf den container Protokolle (
docker logs <container>
) und möglicherweise auf einige debugging auf Ihrem Skript.Wenn Sie einfach zu Fragen, "wie führe ich einen container im hintergrund?", dann Emils Antwort (pass der
-d
Flagge zudocker run
) wird Ihnen helfen.Den Prozess, der docker läuft, tritt an die Stelle der init in der UNIX-Prozess-Baum.
init
ist das oberste parent-Prozess, und sobald Sie aus dem docker-container hält. Jeder Kind-Prozess (jetzt orphan-Prozess) wird angehalten.So können Sie nicht zulassen, dass die parent-pid zu beenden, aber Sie haben zwei Optionen. Sie können verlassen der parent-Prozess in Ort, und lassen Sie es zum verwalten Ihrer Kinder (zum Beispiel, indem Sie sagen,
wait
, bis alle Kind-Prozesse beendet wurden)...oder Sie ersetzen kann der übergeordnete Prozess, der mit der Kind-Prozess mit
exec
. Dies bedeutet, dass der neue Befehl ausgeführt wird, der in der parent-Prozess den Raum...Dieser Letztgenannte Ansatz kann Komplex sein, abhängig von der Art der Kind-Prozess, aber mit weniger unnötige Prozesse ausgeführt werden, ist mehr idiomatically Andockfenster. (Das ist nicht zu sagen, Sie sollten immer nur eine Prozess.)
Führen Sie den Behälter mit Ihrem Skript im hintergrund mit nachstehenden Befehl
Überprüfen Sie die container-id, die von
docker ps
BefehlDann überprüfen Sie Ihr Skript ausgeführt wird oder nicht auf container
Wickeln Sie das Programm mit einem docker-entrypoint.sh bash-Skript, das blockiert die container-Prozess und ist in der Lage zu fangen, Strg-c. Dieses bash-Beispiel sollte helfen:
https://rimuhosting.com/knowledgebase/linux/misc/trapping-ctrl-c-in-bash
Sollte das script Herunterfahren des Prozesses sauber, wenn das exit-signal wird durch Andockfenster.
Können Sie auch eine Schleife im script, die immer wieder überprüft den Laufenden Prozess.