How to run Nginx within a Docker container without halting?

LinuxNginxDocker

Linux Problem Overview


I have Nginx installed on a Docker container, and am trying to run it like this:

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

The problem is that the way Nginx works, is that the initial process immediately spawns a master Nginx process and some workers, and then quits. Since Docker is only watching the PID of the original command, the container then halts.

How do I prevent the container from halting? I need to be able to tell it to bind to the first child process, or stop Nginx's initial process from exiting.

Linux Solutions


Solution 1 - Linux

To expand on Charles Duffy's answer, Nginx uses the daemon off directive to run in the foreground. If it's inconvenient to put this in the configuration file, we can specify it directly on the command line. This makes it easy to run in debug mode (foreground) and directly switch to running in production mode (background) by changing command line args.

To run in foreground:

nginx -g 'daemon off;'

To run in background:

nginx

Solution 2 - Linux

nginx, like all well-behaved programs, can be configured not to self-daemonize.

Use the daemon off configuration directive described in http://wiki.nginx.org/CoreModule.

Solution 3 - Linux

To expand on John's answer you can also use the Dockerfile CMD command as following (in case you want it to self start without additional args)

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

Solution 4 - Linux

Solution 5 - Linux

Adding this command to Dockerfile can disable it:

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

Solution 6 - Linux

Here you have an example of a Dockerfile that runs nginx. As mentionned by Charles, it uses the daemon off configuration:

https://github.com/darron/docker-nginx-php5/blob/master/Dockerfile#L17

Solution 7 - Linux

To add Tomer and Charles answers,

Syntax to run nginx in forground in Docker container using Entrypoint:

ENTRYPOINT nginx -g 'daemon off;' 

Not directly related but to run multiple commands with Entrypoint:

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

Solution 8 - Linux

> For all who come here trying to run a nginx image in a docker > container, that will run as a service

As there is no whole Dockerfile, here is my whole Dockerfile solving the issue.

Nice and working. Thanks to all answers here in order to solve the final nginx issue.

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

And run it with:

docker run -p 80:80 -p 443:443 -dit

Solution 9 - Linux

It is also good idea to use supervisord or runit[1] for service management.

[1] https://github.com/phusion/baseimage-docker

Solution 10 - Linux

In the official notes for the official NGINX image on DockerHub it states:

> If you add a custom CMD in the Dockerfile, be sure to include -g > daemon off; in the CMD in order for nginx to stay in the foreground, > so that Docker can track the process properly (otherwise your > container will stop immediately after starting)!

This makes me thing removing the CMD [] might prevent this issue from occurring in the first place?

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionSeldoView Question on Stackoverflow
Solution 1 - LinuxjohntellsallView Answer on Stackoverflow
Solution 2 - LinuxCharles DuffyView Answer on Stackoverflow
Solution 3 - LinuxTomer Ben DavidView Answer on Stackoverflow
Solution 4 - Linuxnumber5View Answer on Stackoverflow
Solution 5 - LinuxAfshin MehrabaniView Answer on Stackoverflow
Solution 6 - LinuxcreackView Answer on Stackoverflow
Solution 7 - LinuxNitbView Answer on Stackoverflow
Solution 8 - LinuxAlejandro Teixeira MuñozView Answer on Stackoverflow
Solution 9 - LinuxKuntharView Answer on Stackoverflow
Solution 10 - LinuxYorkshire SAView Answer on Stackoverflow