Come eseguire Nginx all'interno di un contenitore Docker senza fermarsi?


130

Ho Nginx installato su un container Docker e sto provando a eseguirlo in questo modo:

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

Il problema è che il modo in cui funziona Nginx è che il processo iniziale genera immediatamente un processo Nginx master e alcuni lavoratori, quindi si chiude. Poiché Docker sta solo guardando il PID del comando originale, il contenitore si ferma.

Come impedire l'arresto del contenitore? Devo essere in grado di dirlo per legare al processo del primo figlio o per interrompere il processo iniziale di Nginx.

Risposte:


165

nginx, come tutti i programmi ben educati, può essere configurato per non auto-demonizzare.

Utilizzare la daemon offdirettiva di configurazione descritta in http://wiki.nginx.org/CoreModule .


15
Grazie! Per chiarire, ciò significa modificare /etc/nginx/nginx.conf e aggiungere "daemon off;" nella parte superiore (cioè non all'interno di un server o altra direttiva)
Seldo

6
Sono un po 'preoccupato che daemon offnon sia approvato da nginx .
Leonid Shevtsov,

7
@LeonidShevtsov ... vuoi dire che non è stato approvato per l'uso in produzione prima della 1.0.9. L'avvertenza permanente, sugli aggiornamenti sul posto, non importa per la gente che fa cose The Docker Way.
Charles Duffy,

Ora sembrano avere un reindirizzamento sul lato server (su nginx.org/en/docs/ngx_core_module.html ).
Charles Duffy,

175

Per espandere la risposta di Charles Duffy, Nginx usa la daemon offdirettiva per essere eseguita in primo piano. Se è scomodo inserirlo nel file di configurazione, possiamo specificarlo direttamente dalla riga di comando. Ciò semplifica l'esecuzione in modalità debug (primo piano) e passa direttamente all'esecuzione in modalità produzione (in background) modificando gli argomenti della riga di comando.

Per eseguire in primo piano:

nginx -g 'daemon off;'

Per eseguire in background:

nginx

3
Qualcuno può spiegare cos'è "-g" in realtà? Non riesco a trovare questo interruttore nei documenti solo questo esempio con nginx che lo utilizza.
red888,

5
@ red888, imposta un'opzione di configurazione globale.
Charles Duffy,

1
CMDsarà CMD ["nginx", "-g", "daemon off;"] per
docker

55

Per espandere la risposta di John puoi anche usare il Dockerfile CMDcomando come segue (nel caso tu voglia che si avvii da solo senza argomenti aggiuntivi)

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

10

L'aggiunta di questo comando a Dockerfile può disabilitarlo:

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



6

Per aggiungere le risposte di Tomer e Charles,

Sintassi per eseguire nginx in forground nel contenitore Docker utilizzando Entrypoint:

ENTRYPOINT nginx -g 'daemon off;' 

Non direttamente correlato ma per eseguire più comandi con Entrypoint:

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


0

Per tutti coloro che vengono qui cercando di eseguire un'immagine nginx in un contenitore finestra mobile, che verrà eseguito come servizio

Poiché non esiste un intero Dockerfile, ecco tutto il mio per Dockerfilerisolvere il problema.

Bello e funzionante. Grazie a tutte le risposte qui per risolvere il problema finale di nginx.

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

Ed eseguilo con:

docker run -p 80:80 -p 443:443 -dit
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.