Ich habe Nginx auf einem Docker-Container installiert und versuche, es folgendermaßen auszuführen:
docker run -i -t -p 80:80 mydockerimage /usr/sbin/nginx
Das Problem ist, dass die Funktionsweise von Nginx darin besteht, dass der anfängliche Prozess sofort einen Master-Nginx-Prozess und einige Worker erzeugt und dann beendet wird. Da Docker nur die PID des ursprünglichen Befehls überwacht, wird der Container angehalten.
Wie verhindere ich, dass der Container anhält? Ich muss in der Lage sein, es anzuweisen, sich an den ersten untergeordneten Prozess zu binden oder zu verhindern, dass der ursprüngliche Prozess von Nginx beendet wird.
daemon off
Nginx dies nicht unterstützt .Um die Antwort von Charles Duffy zu erweitern, verwendet Nginx die
daemon off
Direktive, um im Vordergrund zu laufen. Wenn es unpraktisch ist, dies in die Konfigurationsdatei aufzunehmen, können wir es direkt in der Befehlszeile angeben. Dies erleichtert die Ausführung im Debug-Modus (Vordergrund) und den direkten Wechsel in den Produktionsmodus (Hintergrund) durch Ändern der Befehlszeilenargumente.So laufen Sie im Vordergrund:
So laufen Sie im Hintergrund:
quelle
CMD
wirdCMD ["nginx", "-g", "daemon off;"]
für Docker seinUm Johns Antwort zu erweitern, können Sie den
Dockerfile
CMD
Befehl auch wie folgt verwenden (falls Sie möchten, dass er ohne zusätzliche Argumente selbst gestartet wird).quelle
Durch Hinzufügen dieses Befehls zu Dockerfile kann er deaktiviert werden:
quelle
Nur zu Ihrer Information, ab heute (22. Oktober 2019) haben alle offiziellen Nginx-Docker-Bilder folgende Zeilen:
zB https://github.com/nginxinc/docker-nginx/blob/23a990403d6dbe102bf2c72ab2f6a239e940e3c3/mainline/alpine/Dockerfile#L117
quelle
Hier haben Sie ein Beispiel für eine Docker-Datei, auf der Nginx ausgeführt wird. Wie von Charles erwähnt, verwendet es die
daemon off
Konfiguration:https://github.com/darron/docker-nginx-php5/blob/master/Dockerfile#L17
quelle
Um die Antworten von Tomer und Charles hinzuzufügen,
Syntax zum Ausführen von nginx in forground im Docker-Container mit Entrypoint:
Nicht direkt verwandt, aber um mehrere Befehle mit Entrypoint auszuführen:
quelle
Es ist auch eine gute Idee, Supervisord oder Runit [1] für das Service-Management zu verwenden.
[1] https://github.com/phusion/baseimage-docker
quelle
Da es keine ganze Docker-Datei gibt, ist hier meine ganze
Dockerfile
Lösung des Problems.Schön und arbeitend. Vielen Dank an alle Antworten hier, um das letzte Nginx-Problem zu lösen.
Und führen Sie es aus mit:
quelle