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.

Seldo
quelle

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 .

Charles Duffy
quelle
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
6
Ich bin etwas besorgt, dass daemon offNginx dies nicht unterstützt .
Leonid Shevtsov
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
johntellsall
quelle
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;"]
Tomer Ben David
quelle
10

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

RUN echo "daemon off;" >> /etc/nginx/nginx.conf
Afshin Mehrabani
quelle
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;' 
Nitb
quelle
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 "[email protected]"
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
Alejandro Teixeira Muñoz
quelle