Ich habe Docker-Container mit installierter und konfigurierter Software.
Es darf kein Programm ständig gestartet / ausgeführt werden.
Was ich will - seine Fähigkeit, einen Befehl abhängig von externen Ereignissen zu starten. mögen:
docker exec mysupercont /path/to/mycommand -bla -for
und
docker exec mysupercont /path/to/myothercommand
Aber "exec" ist unmöglich, wenn der Container gestoppt ist, und auch dieser Container enthält einige "funktionierende" Daten, die für diese Befehle verwendet wurden, sodass ich sie nicht verwenden kann
docker run ...
jedes Mal, weil es Container von Bild neu erstellen und meine Daten zerstören.
Was ist der "richtige" und "beste" Weg, um einen solchen Container am Laufen zu halten? Welchen Befehl kann ich drinnen starten?
docker run -d --name=name container tail -f /dev/null
Antworten:
Sie müssen nicht jedes Mal durchführen
docker run
.docker run
ist eigentlich eine Folge von zwei Befehlen: "create" und "start".Wenn Sie den Container ausführen, müssen Sie Folgendes angeben
-it
:Beispiel:
Nach Abschluss der Arbeit wurde der Befehl beim Start angegeben (in meinem Beispiel bash). Zum Beispiel führen Sie den "Exit" durch. Containerhaltestellen:
Jetzt können Sie es erneut starten
Der Container wird gestartet und führt den Befehl "bash" erneut aus.
Stellen Sie mit dem Befehl eine Verbindung zu dieser Sitzung "bash" her
Fazit : Sie müssen den Unterschied zwischen
run
undstart
Container verstehen .Beachten Sie dabei die Dokumentation zur Rolle der Parameter "
-i t
" und "-d
" für den "Run"quelle
docker attach ID
. Holen Sie sich aus dieser Sitzung, ohne Bash zu beenden, können Sie verwendenCTRL-p CTRL-q
Ob Sie einen gestoppten Container starten können oder nicht, hängt davon ab, wie der Container ursprünglich erstellt, dh ausgeführt wurde. Wenn Sie einen beendeten Befehl ausgeführt haben oder einen interaktiven Befehl beenden, z. B. bash, können Sie den gestoppten Container nicht starten, neu starten oder ausführen. Alles was Sie tun können, ist es zu entfernen. Es ist Müll.
Aber Taranakis letzter Kommentar, '-itd', scheint genau das zu sein, was der Hafenarbeiter befohlen hat.
Der Container läuft weiter und Sie können ausführen, was immer Sie wollen, und Sie können den Container stoppen, starten oder neu starten. Dies ist natürlich nur eine vorläufige Feststellung, die auf dem alpinen Image basiert. Wenn Sie eine Verbindung zum Container herstellen, wird dieser beim Beenden angehalten, Sie können ihn jedoch erneut starten.
quelle
Da Sie regelmäßige Aufgaben erwähnt haben und aufgrund der Art und Weise, wie Sie sie verwenden möchten, wahrscheinlich so etwas wie Cron verwenden
docker exec
, habe ich genau das richtige Medikament für Sie. Zumindest habe ich so etwas gemacht.Dockerfile
Laufe mit dem üblichen
docker run -d ....
(habe ich benutztdocker-compose
)Richten Sie die Host-Maschine crontab ein, zum Beispiel:
Ich finde diese Lösung schön, da wir uns in einer ziemlich standardmäßigen Linux-Umgebung auf die alte und bewährte crontab verlassen können, während Docker die exotischeren Deps und Umgebungsvariablen Ihrer Geschäftslogik handhabt. Sie können auch einige Grenzwerte festlegen, wenn Ihre regelmäßigen Aufgaben hängen bleiben und Speicherlecks auftreten oder was auch immer.
quelle
Tail verursacht von Zeit zu Zeit noch einige Dateivorgänge.
Hier ist meine Lösung, um für immer ohne Nebenwirkungen zu schlafen.
Wie es funktioniert
quelle