Jak uruchomić Nginx w kontenerze Docker bez zatrzymywania?

130

Mam Nginx zainstalowany na kontenerze Docker i próbuję go uruchomić w ten sposób:

docker run -i -t -p 80:80 mydockerimage /usr/sbin/nginx

Problem polega na tym, że sposób działania Nginx polega na tym, że początkowy proces natychmiast odradza główny proces Nginx i niektórych pracowników, a następnie kończy pracę. Ponieważ Docker obserwuje tylko PID oryginalnego polecenia, kontener zatrzymuje się.

Jak mogę zapobiec zatrzymywaniu się kontenera? Muszę być w stanie powiedzieć mu, aby związał się z pierwszym procesem potomnym lub zatrzymał początkowy proces Nginx przed zakończeniem.

Seldo
źródło

Odpowiedzi:

165

nginx, podobnie jak wszystkie dobrze działające programy, można skonfigurować tak, aby nie przeprowadzały auto-demonizacji.

Użyj daemon offdyrektywy konfiguracyjnej opisanej w http://wiki.nginx.org/CoreModule .

Charles Duffy
źródło
15
Dzięki! Aby wyjaśnić, oznacza to edycję /etc/nginx/nginx.conf i dodanie „demona off;” na górze (tj. nie wewnątrz serwera lub innej dyrektywy)
Seldo
6
Jestem trochę zaniepokojony, że daemon offnie jest wspierany przez Nginx .
Leonid Shevtsov
7
@LeonidShevtsov ... masz na myśli, że nie został zatwierdzony do użytku produkcyjnego przed 1.0.9. Stałe zastrzeżenie dotyczące uaktualnień w miejscu nie ma znaczenia dla osób wykonujących czynności zgodnie z Docker Way.
Charles Duffy
Wydaje się, że mają teraz przekierowanie po stronie serwera (do nginx.org/en/docs/ngx_core_module.html ).
Charles Duffy
175

Aby rozwinąć odpowiedź Charlesa Duffy'ego, Nginx używa daemon offdyrektywy, aby działać na pierwszym planie. Jeśli umieszczenie tego w pliku konfiguracyjnym jest niewygodne, możemy to określić bezpośrednio w linii poleceń. Ułatwia to uruchamianie w trybie debugowania (pierwszy plan) i bezpośrednie przełączanie do pracy w trybie produkcyjnym (w tle) poprzez zmianę argumentów wiersza poleceń.

Aby uruchomić na pierwszym planie:

nginx -g 'daemon off;'

Aby działać w tle:

nginx
johntellsall
źródło
3
Czy ktoś może wyjaśnić, czym właściwie jest „-g”? Nie mogę znaleźć tego przełącznika w dokumentach, tylko ten jeden przykład z użyciem nginx.
czerwony888
5
@ red888, ustawia opcję konfiguracji globalnej.
Charles Duffy
1
CMDbędzie CMD ["nginx", "-g", "daemon off;"] dla
docker
55

Aby rozwinąć odpowiedź Johna, możesz również użyć następującego Dockerfile CMDpolecenia (na wypadek, gdybyś chciał, aby uruchamiał się samodzielnie bez dodatkowych argumentów)

CMD ["nginx", "-g", "daemon off;"]
Tomer Ben David
źródło
10

Dodanie tego polecenia do Dockerfile może je wyłączyć:

RUN echo "daemon off;" >> /etc/nginx/nginx.conf
Afshin Mehrabani
źródło
6

Aby dodać odpowiedzi Tomera i Charlesa,

Składnia do uruchomienia nginx w forground w kontenerze Docker przy użyciu punktu wejścia:

ENTRYPOINT nginx -g 'daemon off;' 

Nie jest bezpośrednio związane, ale do uruchamiania wielu poleceń z Entrypoint:

ENTRYPOINT /bin/bash -x /myscripts/myscript.sh && nginx -g 'daemon off;' 
Nitb
źródło
0

Dla wszystkich, którzy przyjeżdżają tutaj i próbują uruchomić obraz nginx w kontenerze docker, który będzie działał jako usługa

Ponieważ nie ma całego pliku Dockerfile, oto moje Dockerfilerozwiązanie całego problemu.

Ładnie i dobrze. Dziękuję wszystkim odpowiedziom w celu rozwiązania ostatecznego problemu nginx.

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;'

I uruchom go za pomocą:

docker run -p 80:80 -p 443:443 -dit
Alejandro Teixeira Muñoz
źródło