我在 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/CoreModuledaemon off
中描述的配置指令。
要扩展约翰的答案,您还可以使用以下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 容器中的前台运行 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 [] 可能会首先防止这个问题发生?