Dockerfile-Implementierungscode beim Starten von zwei Prozessen in einem Docker-Container

Dockerfile-Implementierungscode beim Starten von zwei Prozessen in einem Docker-Container

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:

/usr/bin/crontab /run.cront

/usr/sbin/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:
  • Docker verwendet Dockerfile, um ein Container-Image zu erstellen, das den automatischen Start des SSH-Dienstes unterstützt
  • Schritte zum Bereitstellen mehrerer Tomcat-Dienste mithilfe von DockerFile im Docker-Container
  • Ausführen eines mit MyEclipse erstellten Java-Webprojekts in einem Dockerfile-Container in Docker
  • So erstellen Sie einen einfachen Container mit Dockerfile

<<:  innerHTML-Anwendung

>>:  Detaillierte Einführung in die Grundkonzepte von JS

Artikel empfehlen

Beispiel für die MySQL-Volltext-Fuzzy-Suche nach der Methode MATCH AGAINST

MySQL 4.x und höher bieten Unterstützung für die ...

Detaillierte Analyse der Rolle von HTML-Kommentar-Tags <!--...-->

Wenn wir den Quellcode vieler Websites überprüfen...

Ausführliche Erläuterung der HTML-Grundlagen (Teil 1)

1. Das WEB verstehen Webseiten bestehen hauptsäch...

Richtige Methode zum Laden von Schriftarten in Vue.js

Inhaltsverzeichnis Schriftarten mit font-face ric...

Reines CSS3 zur Erzielung einer Mouseover-Schaltflächenanimation, Teil 2

Haben Sie nach den letzten beiden Kapiteln ein ne...

Detaillierte Schritte zur Installation von Docker 1.8 auf CentOS 7

Docker unterstützt die Ausführung auf den folgend...

Überblick und Einführung in das Linux-Betriebssystem

Inhaltsverzeichnis 1. Was ist ein Betriebssystem?...

Führen Sie die Schritte zur Installation von FFmpeg auf dem CentOS-Server aus

Vorwort Die Serversystemumgebung ist: CentOS 6.5 ...

Grafisches Tutorial zur Installation von MySQL 5.7.19 (tar.gz) unter Linux

Das erste Tutorial zur Installation der MySQL-5.7...

Detailliertes Tutorial zur Installation von Ubuntu 19.10 auf Raspberry Pi 4

Da einige Abhängigkeiten von OpenCV beim Ausführe...

Vue3.0 Handschrift-Lupeneffekt

Der zu erzielende Effekt ist: Festes Vergrößern a...

Detaillierte Erklärung der Docker Compose-Verwendung

Inhaltsverzeichnis Docker Compose-Nutzungsszenari...

Zusammenfassung der Verwendung von Linux-SFTP-Befehlen

sftp ist die Abkürzung für Secure File Transfer P...

So verwenden Sie einen Gamecontroller in CocosCreator

Inhaltsverzeichnis 1. Szenenlayout 2. Fügen Sie e...