Frage Die richtige Methode zum Beibehalten des Andockcontainers wurde gestartet, wenn er für periodische Aufgaben verwendet wurde


Ich habe einen Andock-Container mit installierter und konfigurierter Software.

Es gibt kein Programm, das ständig gestartet / ausgeführt werden soll.

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" unmöglich, wenn Container gestoppt ist, und auch dieser Container haben einige "Arbeitsdaten" innerhalb, die für diese Befehle verwendet, so kann ich nicht verwenden

docker run ...

jedes Mal, weil es Behälter vom Bild neu erstellt und meine Daten zerstört.

Was ist der "richtige" und der "beste" Weg, um einen solchen Container zu betreiben? Welchen Befehl kann ich innen beginnen?


36
2018-01-23 16:24


Ursprung


Dies ist eine sehr gut erklärte Frage. Siehe einen anderen ähnlichen Beitrag Hier. - Grant Li
docker run -d --name=name container tail -f /dev/null - steampowered


Antworten:


Sie müssen nicht jedes Mal durchführen docker run.

docker run ist eigentlich eine Abfolge von zwei Befehlen: "create" und "start".

Wenn Sie den Container ausführen, müssen Sie den "-it":

-i, --interactive = false Halten Sie STDIN offen, auch wenn es nicht angehängt ist
  -t, --tty = false Ordne ein Pseudo-TTY zu

Beispiel:

docker run -it debian:stable bash

Nachdem die Arbeit abgeschlossen wurde, wurde der Befehl beim Start angegeben (in meinem Beispiel Bash). Zum Beispiel führen Sie den "Ausgang" aus. Container stoppt:

CONTAINER ID        IMAGE                      COMMAND                CREATED             STATUS                     PORTS               NAMES
1329c99a831b        debian:stable              "bash"                 51 seconds ago      Exited (0) 1 seconds ago                       goofy_bardeen

Jetzt können Sie es erneut starten

docker start 1329c99a831b

Der Container wird gestartet und führt erneut den Befehl "bash" aus.
Verbinden Sie sich mit dem Befehl mit dieser Sitzung "bash"

docker attach 1329c99a831b

Um zusammenzufassen: Sie müssen den Unterschied zwischen den verstehen run und start Container.
Sieh dir außerdem die Dokumentation für die Rolle der Parameter "-i t" und "-d"für den" Lauf "


42
2018-01-27 05:04



Aha, das verstehe ich. Frage war: Ich habe nichts, um innerhalb des Containers zu laufen, aber ich muss es in "run" Zustand halten So ist deine Antwort - benutze bash, um Behälter in laufendem Zustand zu halten? - Korjavin Ivan
Ja. Der Prozess, den Sie zur Laufzeit angegeben haben, muss weiterhin ausgeführt werden. Das einfachste Beispiel ist bash. Vielleicht werden Sie der einfachste Weg sein, den Container mit dem "-d" zu starten und sich bei Bedarf mit dem "-d" zu verbinden docker attach ID. Raus aus dieser Sitzung, ohne bash zu beenden, können Sie verwenden CTRL-p CTRL-q - MSemochkin
Der Prozess, den Sie während des Containerlaufs angeben, erhält die PID 1. Dementsprechend kann der Container ohne ihn nicht arbeiten - MSemochkin
Meine Erfahrung mit Start und Attach (oder Start mit -ai) ist, dass die Eingabeaufforderung und die interaktive Bearbeitung Ihrer Befehlszeile nicht angezeigt wird. ZB das tty ist nicht Rendering oder Echo. - dlamblin
Das ist schick. Wenn Sie den Container im Hintergrund starten möchten, ohne ihn manuell neu starten zu müssen (z. B. wenn Sie einen Webdienst ausführen), verwenden Sie die Parameter '-dit' und CTRL-p CTRL-q, um die Verbindung zu trennen, ohne die Anwendung zu stoppen Container. - taranaki


Diese ganze Angelegenheit, ob ein gestoppter Container gestartet werden kann oder nicht, hängt davon ab, wie der Container ursprünglich erstellt, d. H. Ausgeführt wurde. Wenn Sie einen Befehl ausgeführt haben, der beendet wurde, oder Sie einen interaktiven Befehl beenden, z. 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 das zu sein, was der Hafenarbeiter bestellt hat.

Der Container wird weiter ausgeführt und Sie können ausführen, was Sie möchten. Sie können den Container anhalten, starten oder neu starten. Dies ist natürlich nur ein vorläufiger Befund, der auf dem Alpenbild basiert. Hinweis: Wenn Sie den Container anfügen, wird er beim Beenden angehalten, Sie können ihn jedoch erneut starten.


4
2018-02-07 17:21



+1 "scheint das zu sein, was der Hafenarbeiter bestellt hat" :-) - Matt Alexander


Da Sie periodische Aufgaben erwähnt haben, verwenden Sie wahrscheinlich so etwas wie cron wegen der Art, die Sie verwenden möchten docker execIch habe nur die Medizin für dich. Zumindest habe ich so etwas gemacht.

  1. Dockerfile

    FROM <some base>
    CMD tail -f /dev/null
    
  2. Lauf mit dem Üblichen docker run -d .... (Ich benutzte docker-compose)

  3. Setup Host-Maschinen crontab, zum Beispiel:

    * * * * * docker exec mysupercont foo >> /var/log/foo.log 2>&1
    * * * * * docker exec mysupercont bar >> /var/log/bar.log 2>&1
    

Ich finde diese Lösung gut, da wir uns auf die alte und bewährte Crontab in einer hübschen Standard-Linux-Umgebung verlassen, während Docker die exotischeren Deps und Umgebungsvariablen Ihrer Geschäftslogik behandelt. Sie können auch einige Grenzen setzen, wenn Ihre regelmäßigen Aufgaben hängen bleiben und Speicherlecks oder was auch immer haben.


0
2018-05-03 19:55