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

Sel*_*ldo 105 linux nginx docker

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

docker run -i -t -p 80:80 mydockerimage /usr/sbin/nginx
Run Code Online (Sandbox Code Playgroud)

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

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

Cha*_*ffy 147

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

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

  • 谢谢!澄清一下,这意味着编辑/etc/nginx/nginx.conf并添加"daemon off;" 在顶部(即不在服务器或其他指令内) (15认同)
  • 我有点担心[`daemon off`没有得到nginx认可](http://nginx.org/en/docs/faq/daemon_master_process_off.html). (6认同)
  • @LeonidShevtsov ...你的意思是_wasn't_赞同1.0.9之前的生产用途.关于就地升级的常设警告对于做Docker Way的人来说并不重要. (6认同)

joh*_*all 140

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

要在前台运行:

nginx -g 'daemon off;'
Run Code Online (Sandbox Code Playgroud)

要在后台运行:

nginx
Run Code Online (Sandbox Code Playgroud)

  • `CMD` 将是 `CMD ["nginx", "-g", "daemon off;"] ` [对于 docker](https://github.com/duwamish-os/nginx-base/blob/master/Dockerfile #L9) (9认同)
  • 如果末尾没有分号,它就会消失 (4认同)
  • @ red888,设置全局配置选项。 (3认同)
  • 有人可以解释“ -g”实际上是什么吗?我在文档中仅使用nginx的这个示例找不到此开关。 (2认同)

Tom*_*vid 48

要扩展John的答案,您还可以使用以下Dockerfile CMD命令(如果您希望它自行启动而无需额外的args)

CMD ["nginx", "-g", "daemon off;"]
Run Code Online (Sandbox Code Playgroud)


Afs*_*ani 9

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

RUN echo "daemon off;" >> /etc/nginx/nginx.conf
Run Code Online (Sandbox Code Playgroud)


Nit*_*itb 7

要添加 Tomer 和 Charles 的答案,

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

ENTRYPOINT nginx -g 'daemon off;' 
Run Code Online (Sandbox Code Playgroud)

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

ENTRYPOINT /bin/bash -x /myscripts/myscript.sh && nginx -g 'daemon off;' 
Run Code Online (Sandbox Code Playgroud)


cre*_*ack 6

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

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

  • 以及官方的 Nginx Dockerfile:https://github.com/dockerfile/nginx/blob/master/Dockerfile#L15 (2认同)