![](/img/trans.png)
[英]How to run Nginx within a Docker container and set it up to reload its configuration every 6h?
[英]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;"]
将此命令添加到 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] 进行服务管理也是一个好主意。
对于所有来这里尝试在 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.