繁体   English   中英

如何在不停止的情况下在 Docker 容器中运行 Nginx?

[英]How to run Nginx within a Docker container without halting?

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

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

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

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

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

在前台运行:

nginx -g 'daemon off;'

在后台运行:

nginx

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

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

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

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

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

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

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

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

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

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

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

要添加 Tomer 和 Charles 的答案,

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

ENTRYPOINT nginx -g 'daemon off;' 

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

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

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

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

对于所有来这里尝试在 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

在 DockerHub 上官方 NGINX 映像的官方说明中,它指出:

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

这让我首先删除 CMD [] 可能会阻止此问题的发生?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM