¿Cómo ejecutar Nginx dentro de un contenedor Docker sin detenerse?

130

Tengo Nginx instalado en un contenedor Docker, y estoy tratando de ejecutarlo así:

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

El problema es que la forma en que funciona Nginx es que el proceso inicial genera inmediatamente un proceso maestro de Nginx y algunos trabajadores, y luego se cierra. Como Docker solo está mirando el PID del comando original, el contenedor se detiene.

¿Cómo evito que el contenedor se detenga? Necesito poder decirle que se una al primer proceso secundario, o que detenga la salida del proceso inicial de Nginx.

Seldo
fuente

Respuestas:

165

nginx, como todos los programas con buen comportamiento, se puede configurar para que no se auto-demonice.

Utilice la daemon offdirectiva de configuración descrita en http://wiki.nginx.org/CoreModule .

Charles Duffy
fuente
15
¡Gracias! Para aclarar, eso significa editar /etc/nginx/nginx.conf y agregar "daemon off"; en la parte superior (es decir, no dentro de un servidor u otra directiva)
Seldo
66
Me preocupa un poco que daemon offno esté respaldado por nginx .
Leonid Shevtsov
77
@LeonidShevtsov ... quiere decir que no fue aprobado para su uso en producción antes de 1.0.9. La advertencia permanente, sobre las actualizaciones en el lugar, no les importa a las personas que hacen cosas a la manera de Docker.
Charles Duffy
Parecen tener ahora una redirección en el lado del servidor (a nginx.org/en/docs/ngx_core_module.html ).
Charles Duffy
175

Para ampliar la respuesta de Charles Duffy, Nginx usa el daemon off directiva para ejecutar en primer plano. Si no es conveniente poner esto en el archivo de configuración, podemos especificarlo directamente en la línea de comando. Esto facilita la ejecución en modo de depuración (primer plano) y cambia directamente a la ejecución en modo de producción (fondo) cambiando los argumentos de la línea de comandos.

Para ejecutar en primer plano:

nginx -g 'daemon off;'

Para ejecutar en segundo plano:

nginx
johntellsall
fuente
3
¿Alguien puede explicar qué es realmente "-g"? No puedo encontrar este interruptor en los documentos solo en este ejemplo con nginx usándolo.
red888
55
@ red888, establece una opción de configuración global.
Charles Duffy
1
CMDserá CMD ["nginx", "-g", "daemon off;"] para
acoplador
55

Para ampliar la respuesta de John, también puede usar el Dockerfile CMDcomando de la siguiente manera (en caso de que desee que se inicie automáticamente sin argumentos adicionales)

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

Agregar este comando a Dockerfile puede deshabilitarlo:

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

Para agregar las respuestas de Tomer y Charles,

Sintaxis para ejecutar nginx en primer plano en el contenedor Docker usando Entrypoint:

ENTRYPOINT nginx -g 'daemon off;' 

No está directamente relacionado, pero para ejecutar varios comandos con Entrypoint:

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

Para todos los que vienen aquí tratando de ejecutar una imagen nginx en un contenedor acoplable, se ejecutará como un servicio

Como no hay todo el Dockerfile, aquí está todo mi Dockerfile resolver el problema.

Agradable y trabajando. Gracias a todas las respuestas aquí para resolver el problema final de 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;'

Y ejecútalo con:

docker run -p 80:80 -p 443:443 -dit
Alejandro Teixeira Muñoz
fuente