Docker启动Nginx容器有entrypoint或command时自动退出解决
问题如标题所示,在升级优化 DNMP的时候,一直遇到这个问题没解决。
后来一遍遍谷歌后才在 reddit(地址在参考资料处) 上找到提示,
再返回Nginx的docker仓库仔细查看说明,其实是有说明的 /捂脸~
就是在CMD后面加上exec nginx -g 'daemon off;'
,如下:
command: /bin/bash -c "echo 'hello' && exec nginx -g 'daemon off;'"
Nginx的docker仓库原文说明如下:
If you add a custom CMD in the Dockerfile, be sure to include
-g daemon off;
in the CMD in order for nginx to stay in the foreground, so that Docker can track the process properly (otherwise your container will stop immediately after starting)!
— 这里的CMD
适用 docker-compose.yml 中的entrypoint
和command
,以及 Dockerfile 中的ENTRYPOINT
和CMD
。
也就是说:
Docker 容器启动时,默认会把容器内部第一个进程,也就是
pid=1
的程序,作为docker容器是否正在运行的依据,如果 docker 容器pid=1的进程挂了,那么docker容器便会直接退出。Docker未执行自定义的CMD之前,nginx的pid是1,执行到CMD之后,nginx就在后台运行,bash或sh脚本的pid变成了1。
所以一旦执行完自定义CMD,nginx容器也就退出了。
参考资料:
- [nginx:alpine] How to prevent exiting of the container after the entrypoint.sh script was executed?
- docker运行nginx为什么要使用 daemon off
- nginx daemon
下一篇: 如何保存数组配置到PHP文件
非常好的文章!
呃呃呃
总算知道为什么debian容器不带-it 运行会无限自动重启了…