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

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

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

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

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

205687 次浏览

像所有行为良好的程序一样,nginx可以配置为不自我妖魔化。

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

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

Https://github.com/darron/docker-nginx-php5/blob/master/dockerfile#l17

在服务管理中使用 superord 或 runit [1]也是一个好主意。

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

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

在前景中奔跑:

nginx -g 'daemon off;'

在后台运行:

nginx

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

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

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

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

再加上托莫和查尔斯的回答,

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

ENTRYPOINT nginx -g 'daemon off;'

与 Entrypoint 没有直接关系,但与运行多个命令有关:

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

仅供参考,截至今日(2019年10月22日) ,官方 Nginx 码头图片都有专线:

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

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

对于所有来这里尝试运行 nginx 映像在一个 Docker 容器,它将作为服务运行

由于没有完整的 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

在 DockerHub 上 NGINX 官方图片的官方说明中写道:

如果您在 Dockerfile 中添加自定义 CMD,请确保在 CMD 中包含 -g daemon off;,以便 nginx 保持在前台, 这样 Docker 就可以正确地跟踪过程(否则 集装箱启动后会立即停止) !

这让我觉得移除 CMD []可能从一开始就阻止这个问题的发生?