Ich möchte kürzlich einen Docker für Cron-geplante Aufgaben erstellen und ihn wie folgt in Dockerfile definieren VON Bibliothek/Alpine:latest Führen Sie den Befehl apk --update aus und fügen Sie rsync openssh bash hinzu. VOLUMEN ["/Daten"] HINZUFÜGEN start.sh / CMD ["/bin/bash","/start.sh"] Verwenden Sie crontab, um die geplante Aufgabe run.cron in start.sh zu laden, und starten Sie dann crond:
Nachdem Docker die Docker-Datei erstellt hatte, habe ich Docker Run –Name xxx -d verwendet, um den Container auszuführen. Ich habe festgestellt, dass der Container nach der Ausführung von start.sh beendet wurde und ich die geplante Aufgabe überhaupt nicht starten konnte. Ich habe verschiedene Methoden online ausprobiert, darunter die Verwendung von Nohup, einer Endlosschleife und der Verwendung von Signalen, aber ich habe festgestellt, dass keine davon zuverlässig war. Nach der Analyse des Docker-Mechanismus kann ein Docker-Container jeweils nur einen Prozess verwalten. Wenn der Prozess beendet wird, wird auch der Container beendet. Dies bedeutet nicht, dass in einem Container immer nur ein Prozess ausgeführt werden kann (das wäre Verschwendung), aber der zuletzt ausgeführte Prozess kann nicht beendet werden. In diesem Fall wird start.sh ausgeführt, wenn der Container gestartet wird. Die Standardeinstellung von crond ist die Ausführung im Hintergrund, wodurch start.sh beendet wird und der Container beendet wird, wenn start.sh beendet wird. Daher sollte in start.sh die Ausführung von crond im Vordergrund erzwungen werden: crond -f. Auf diese Weise wird start.sh nicht beendet und docker run -d kann den Container im Hintergrund weiterlaufen lassen. Zusammenfassung von start.sh: (1) Wenn mehrere Daemon-Prozesse in einem Container ausgeführt werden, muss der erste Prozess im Hintergrund ausgeführt werden (oder hinzufügen &), da sonst die nachfolgenden Dienste nicht gestartet werden können (2) Der letzte Daemon-Prozess im Container muss im Vordergrund ausgeführt werden, da sonst start.sh beendet wird, der Container beendet wird und alle Dienste vergeblich gestartet werden. VON Ubuntu:latest RUN mkdir -p "/usr/src/pdas" \ mkdir -p "/usr/src/pdas/neu laden" KOPIEREN Sie bin.tar /usr/src/pdas KOPIEREN Sie config.tar /usr/src/pdas KOPIEREN Sie lib.tar /usr/src/pdas ARBEITSVERZEICHNIS /usr/src/pdas RUN tar -xvf lib.tar && \ tar -xvf bin.tar && \ tar -xvf konfiguration.tar ENV LD_LIBRARY_PATH /usr/src/pdas/lib/libxml/lib:/usr/src/pdas/lib/curl/lib:$LD_LIBRARY_PATH ARBEITSVERZEICHNIS /usr/src/pdas/bin RUN chmod +x start.sh && \ chmod +x f_recv && \ chmod +x f_send VOLUMEN /behb/diqu VOLUME /var/log/pdas EINSTIEGSPUNKT ./start.sh Das Skript ./start.sh lautet wie folgt #!/bin/bash ./f_recv & ./f_send Oben sind einige Gedanken zum Startskript des Docker-Images. Zusatzwissen: Umgang mit mehreren Prozessen in Docker Normalerweise eignen sich Docker-Container zum Ausführen eines einzelnen Prozesses, aber häufig müssen wir mehrere Prozesse in einem Docker-Container ausführen. Es gibt zwei verschiedene Möglichkeiten, Multiprozesscontainer auszuführen: mit einem Shell-Skript oder mit einem Supervisor. Beide Methoden sind einfach und haben ihre eigenen Vor- und Nachteile, aber es gibt einige Details, die es zu beachten gilt. Hier wird lediglich auf die Verarbeitungsmethode mittels Skripten eingegangen. Schreiben Sie ein Skript multiple_thread.sh. Das Skript führt zwei Python-Programme aus und speichert die Ergebnisse in einer Protokolldatei. Der Skriptinhalt ist wie folgt #!/bin/bash # Starten Sie den ersten Prozess nohup python -u /tmp/thread1.py > /tmp/thread1.log 2>&1 & ps aux |grep thread1 |grep -q -v grep PROCESS_1_STATUS=$? echo "Thread1-Status …" echo $PROCESS_1_STATUS wenn [ $PROCESS_1_STATUS -ne 0 ]; dann echo "Mein erster Prozess konnte nicht gestartet werden: $PROCESS_2_STATUS" beenden $PROCESS_1_STATUS fi Schlaf 5 # Starten Sie den zweiten Prozess nohup python -u /tmp/thread2.py > /tmp/thread2.log 2>&1 & ps aux |grep thread2 |grep -q -v grep PROCESS_2_STATUS=$? echo "Thread2-Status …" echo $PROCESS_2_STATUS wenn [ $PROCESS_2_STATUS -ne 0 ]; dann echo "Mein zweiter Prozess konnte nicht gestartet werden: $PROCESS_2_STATUS" beenden $PROCESS_2_STATUS fi # Überprüfen Sie alle 60 Sekunden, ob der Prozess läuft, während sleep 60; ps aux |grep thread1 |grep -q -v grep PROCESS_1_STATUS=$? ps aux |grep thread2 |grep -q -v grep PROCESS_2_STATUS=$? # Wenn die obigen Greps etwas finden, werden sie mit dem Status 0 beendet # Wenn nicht beide 0 sind, dann stimmt etwas nicht wenn [ $PROCESS_1_STATUS -ne 0 -o $PROCESS_2_STATUS -ne 0 ]; dann echo "Einer der Prozesse wurde bereits beendet." Ausfahrt 1 fi Erstellen Sie als Nächstes die Docker-Datei: VON centos:latest KOPIEREN thread1.py /tmp/thread1.py KOPIEREN thread2.py /tmp/thread2.py KOPIEREN Sie multiple_thread.sh /tmp/multiple_thread.sh CMD bash /tmp/multiple_thread.sh Der obige Dockerfile-Implementierungscode zum Starten von zwei Prozessen in einem Docker-Container ist alles, was ich mit Ihnen teilen kann. Ich hoffe, er kann Ihnen als Referenz dienen, und ich hoffe auch, dass Sie 123WORDPRESS.COM unterstützen werden. Das könnte Sie auch interessieren:
|
>>: Detaillierte Einführung in die Grundkonzepte von JS
1. haslayout und bfc sind IE-spezifische und Stand...
Firefox, Opera und andere Browser unterstützen Web...
In diesem Artikel wird der spezifische Code für J...
Inhaltsverzeichnis Funktionsprinzip: Was macht de...
1. Docker zieht das Image Docker Pull MySQL (stan...
Dieser Artikel veranschaulicht anhand eines Beisp...
In diesem Tutorial erfahren Sie alles über die In...
Manchmal werden einige Docker-Container nach eine...
MySQL-Leistungsoptimierung Die MySQL-Leistungsopt...
HTML-Onfocus-Ereignisattribute Definition und Ver...
Grundlegende Umgebungskonfiguration Bitte kaufen ...
Inhaltsverzeichnis Lassen Sie uns zunächst kurz P...
Inhaltsverzeichnis 1minio ist einfach 2 Docker er...
MySQL ist eine leistungsstarke Open-Source-Datenb...
Sechs EffekteImplementierungscode html <h1>...