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


130

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.

Antworten:


165

nginxkann wie alle gut erzogenen Programme so konfiguriert werden, dass sie sich nicht selbst dämonisieren.

Verwenden Sie die unter http://wiki.nginx.org/CoreModuledaemon off beschriebene Konfigurationsanweisung .


15
Vielen Dank! Zur Verdeutlichung bedeutet dies, dass Sie /etc/nginx/nginx.conf bearbeiten und "daemon off" hinzufügen. oben (dh nicht innerhalb eines Servers oder einer anderen Direktive)
Seldo


7
@LeonidShevtsov ... Sie meinen, wurde vor 1.0.9 nicht für den Produktionseinsatz empfohlen. Die ständige Einschränkung, dass Upgrades vor Ort durchgeführt werden, spielt für die Leute, die Dinge tun, keine Rolle. The Docker Way.
Charles Duffy

Sie scheinen jetzt serverseitig umgeleitet zu sein (zu nginx.org/en/docs/ngx_core_module.html ).
Charles Duffy

173

Um die Antwort von Charles Duffy zu erweitern, verwendet Nginx die daemon offDirektive, 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:

nginx -g 'daemon off;'

So laufen Sie im Hintergrund:

nginx

3
Kann jemand erklären, was "-g" eigentlich ist? Ich kann diesen Schalter nicht in den Dokumenten finden, nur in diesem einen Beispiel, in dem Nginx ihn verwendet.
Red888

5
@ red888, legt eine globale Konfigurationsoption fest.
Charles Duffy

1
CMDwird CMD ["nginx", "-g", "daemon off;"] für Docker sein
betet

55

Um Johns Antwort zu erweitern, können Sie den Dockerfile CMDBefehl auch wie folgt verwenden (falls Sie möchten, dass er ohne zusätzliche Argumente selbst gestartet wird).

CMD ["nginx", "-g", "daemon off;"]

10

Durch Hinzufügen dieses Befehls zu Dockerfile kann er deaktiviert werden:

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



6

Um die Antworten von Tomer und Charles hinzuzufügen,

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

ENTRYPOINT nginx -g 'daemon off;' 

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

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


0

Für alle, die hierher kommen und versuchen, ein Nginx-Image in einem Docker-Container auszuführen, wird dies als Dienst ausgeführt

Da es keine ganze Docker-Datei gibt, ist hier meine ganze DockerfileLösung des Problems.

Schön und arbeitend. Vielen Dank an alle Antworten hier, um das letzte Nginx-Problem zu lösen.

FROM ubuntu:18.04
MAINTAINER stackoverfloguy "stackoverfloguy@foo.com"
RUN apt-get update -y
RUN apt-get install net-tools nginx ufw sudo -y
RUN adduser --disabled-password --gecos '' docker
RUN adduser docker sudo
RUN echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers
USER docker
RUN sudo ufw default allow incoming
RUN sudo rm /etc/nginx/nginx.conf
RUN sudo rm /etc/nginx/sites-available/default
RUN sudo rm /var/www/html/index.nginx-debian.html
VOLUME /var/log
VOLUME /usr/share/nginx/html
VOLUME /etc/nginx
VOLUME /var/run
COPY conf/nginx.conf /etc/nginx/nginx.conf
COPY content/* /var/www/html/
COPY Dockerfile /var/www/html
COPY start.sh /etc/nginx/start.sh
RUN sudo chmod +x /etc/nginx/start.sh
RUN sudo chmod -R 777 /var/www/html
EXPOSE 80
EXPOSE 443
ENTRYPOINT sudo nginx -c /etc/nginx/nginx.conf -g 'daemon off;'

Und führen Sie es aus mit:

docker run -p 80:80 -p 443:443 -dit
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.