如何在Docker容器中运行Nginx而不停止?

时间:2013-09-17 23:03:15

标签: linux nginx docker

我在Docker容器上安装了Nginx,我试图像这样运行它:

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

问题在于Nginx的工作方式是初始进程立即产生一个主Nginx进程和一些工作者,然后退出。由于Docker只关注原始命令的PID,因此容器会停止。

如何防止容器停止?我需要能够告诉它绑定到第一个子进程,或者阻止Nginx的初始进程退出。

9 个答案:

答案 0 :(得分:130)

与所有表现良好的程序一样,

nginx可以配置为不会自我守护。

使用http://wiki.nginx.org/CoreModule中描述的daemon off配置指令。

答案 1 :(得分:121)

为了扩展Charles Duffy的答案,Nginx使用daemon off指令在前台运行。如果将它放在配置文件中不方便,我们可以直接在命令行中指定它。这样可以很容易地在调试模式(前台)中运行,并通过更改命令行参数直接切换到在生产模式(后台)中运行。

在前台运行:

nginx -g 'daemon off;'

在后台运行:

nginx

答案 2 :(得分:38)

要扩展John的答案,您还可以使用Dockerfile CMD命令,如下所示(如果您希望自行启动而不需要额外的参数)

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

答案 3 :(得分:6)

将此命令添加到Dockerfile可以禁用它:

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

答案 4 :(得分:5)

这里有一个运行nginx的Dockerfile示例。正如Charles所提到的,它使用daemon off配置:

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

答案 5 :(得分:3)

使用supervisord或runit [1]进行服务管理也是个好主意。

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

答案 6 :(得分:1)

仅供参考,截至今天(2019年10月22日)official Nginx docker images均行:

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

例如https://github.com/nginxinc/docker-nginx/blob/23a990403d6dbe102bf2c72ab2f6a239e940e3c3/mainline/alpine/Dockerfile#L117

答案 7 :(得分:1)

对于所有来这里尝试在docker中运行Nginx映像的人 容器,它将作为服务运行

由于没有完整的Dockerfile,这是我整个(domain, logged_at)解决的问题。

工作愉快。感谢这里的所有答案,以便解决最终的nginx问题。

Dockerfile

并运行:

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

答案 8 :(得分:0)

要添加Tomer和Charles的答案,

使用Entrypoint在Docker容器的Forground中运行Nginx的语法:

ENTRYPOINT nginx -g 'daemon off;' 

不是直接相关的,而是要与Entrypoint运行多个命令:

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