170

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

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

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

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

4

10 回答 10

234

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

在前台运行:

nginx -g 'daemon off;'

在后台运行:

nginx
于 2015-01-22T22:38:23.597 回答
200

nginx,像所有表现良好的程序一样,可以配置为不进行自我守护。

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

于 2013-09-17T23:04:48.217 回答
74

要扩展约翰的答案,您还可以使用以下Dockerfile CMD命令(如果您希望它在没有其他参数的情况下自行启动)

CMD ["nginx", "-g", "daemon off;"]
于 2016-11-27T10:52:20.957 回答
24

仅供参考,截至今天(2019 年 10 月 22 日),官方 Nginx docker 镜像都具有以下行:

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

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

于 2019-10-22T11:02:20.627 回答
12

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

RUN echo "daemon off;" >> /etc/nginx/nginx.conf
于 2017-04-26T10:19:13.490 回答
7

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

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

于 2013-09-17T23:38:24.043 回答
7

要添加 Tomer 和 Charles 的答案,

使用入口点在 Docker 容器中的前台运行 nginx 的语法:

ENTRYPOINT nginx -g 'daemon off;' 

不直接相关,但要使用 Entrypoint 运行多个命令:

ENTRYPOINT /bin/bash -x /myscripts/myscript.sh && nginx -g 'daemon off;' 
于 2018-12-24T10:02:18.947 回答
3

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

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

于 2014-08-25T14:52:36.627 回答
3

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

由于没有完整的 Dockerfile,这是我Dockerfile解决问题的全部内容。

尼斯和工作。感谢这里的所有答案,以解决最终的 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;'

并运行它:

docker run -p 80:80 -p 443:443 -dit
于 2020-04-08T17:08:32.383 回答
0

在 DockerHub 上官方 NGINX 镜像的官方注释中,它指出:

如果在 Dockerfile 中添加自定义 CMD,请务必-g daemon off;在 CMD 中包含,以便 nginx 留在前台,以便 Docker 可以正确跟踪进程(否则您的容器将在启动后立即停止)!

这让我觉得删除 CMD [] 可能会首先防止这个问题发生?

于 2021-12-19T00:25:34.473 回答