it-swarm.com.de

Wie kann ich Nginx in einem Docker-Container ausführen, ohne anzuhalten?

Ich habe Nginx in einem Docker-Container installiert und versuche es so 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 Arbeiter 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 angehalten wird? Ich muss in der Lage sein, es an den ersten untergeordneten Prozess zu binden oder den ursprünglichen Prozess von Nginx zu stoppen.

80
Seldo

nginx kann wie alle gut verhaltenen Programme so konfiguriert werden, dass sie sich nicht selbst dämonen.

Verwenden Sie die daemon off-Konfigurationsanweisung, die in http://wiki.nginx.org/CoreModule beschrieben ist.

115
Charles Duffy

Um die Antwort von Charles Duffy zu erweitern, verwendet Nginx die daemon off-Direktive, um im Vordergrund ausgeführt zu werden. Wenn es unbequem ist, dies in die Konfigurationsdatei zu schreiben, können Sie es direkt in der Befehlszeile angeben. Dies macht es einfach, im Debug-Modus (Vordergrund) auszuführen und direkt in den Produktionsmodus (Hintergrund) zu wechseln, indem Befehlszeilenargumente geändert werden.

Im Vordergrund laufen:

nginx -g 'daemon off;'

Im Hintergrund laufen:

nginx
111
johntellsall

Um Johns Antwort zu erweitern, können Sie den Befehl DockerfileCMD wie folgt verwenden (falls Sie möchten, dass er ohne zusätzliche Argumente selbst startet)

CMD ["nginx", "-g", "daemon off;"]
34
Tomer Ben David

Wenn Sie diesen Befehl zu Dockerfile hinzufügen, kann er deaktiviert werden:

RUN echo "daemon off;" >> /etc/nginx/nginx.conf
6

Hier haben Sie ein Beispiel für eine Dockerfile, die nginx ausführt. Wie von Charles erwähnt, verwendet es die daemon off-Konfiguration:

https://github.com/darron/docker-nginx-php5/blob/master/Dockerfile#L17

5
creack

Es ist auch eine gute Idee, Supervisord oder Runit [1] für das Service Management zu verwenden.

[1] https://github.com/phusion/baseimage-docker

3
Kunthar

Um Tomer und Charles Antworten hinzuzufügen, 

Syntax zum Ausführen von nginx im Vordergrund im Docker-Container mit Entrypoint:

ENTRYPOINT nginx -g 'daemon off;' 

Nicht direkt verwandt, sondern um mehrere Befehle mit Entrypoint auszuführen:

ENTRYPOINT /bin/bash -x /myscripts/myscript.sh && nginx -g 'daemon off;' 
0
Nitb