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

Verständnis von Haslaylout- und BFC-Parsing

1. haslayout und bfc sind IE-spezifische und Stand...

So unterstützen Sie Webdings-Schriftarten in Firefox

Firefox, Opera und andere Browser unterstützen Web...

Dieser Artikel zeigt Ihnen, was Vite mit der Anfrage des Browsers macht

Inhaltsverzeichnis Funktionsprinzip: Was macht de...

Grafisches Tutorial zur Installation und Konfiguration von MySQL 5.7

In diesem Tutorial erfahren Sie alles über die In...

Schritte für den Exit-Fehlercode des Docker-Containers

Manchmal werden einige Docker-Container nach eine...

Beispiel zur Optimierung der MySQL-Einfügeleistung

MySQL-Leistungsoptimierung Die MySQL-Leistungsopt...

So stellen Sie DoNetCore mit Nginx in der Alibaba Cloud bereit

Grundlegende Umgebungskonfiguration Bitte kaufen ...

MySQL-Platzhalter (erweiterte SQL-Filterung)

Inhaltsverzeichnis Lassen Sie uns zunächst kurz P...

Teilen Sie 101 MySQL-Debugging- und Optimierungstipps

MySQL ist eine leistungsstarke Open-Source-Datenb...

Sechs mit CSS3 implementierte Randübergangseffekte

Sechs EffekteImplementierungscode html <h1>...