必须用 daemon off,因为 docker 容器生命周期由 pid 1 进程决定;nginx 默认 daemon on 会 fork 后退出,使 shell 成为 pid 1 并随之终止,导致容器立即退出;daemon off 强制 nginx 前台运行并占据 pid 1,确保容器持续运行。

要在 Docker 容器中稳定运行 Nginx,必须让它以前台模式启动并占据 PID 1。核心就是配置 daemon off,否则容器会启动即退。
为什么必须用 daemon off
Docker 容器的生命周期完全由 PID 1 进程决定。Nginx 默认开启守护进程(daemon on),主进程 fork 出 worker 后就退出,导致 PID 1(通常是 shell)随之结束 → 容器立即终止。daemon off 强制 Nginx 不 detach、不 fork,主进程持续运行在前台,稳坐 PID 1 位置。
推荐的 CMD 写法:exec 形式数组语法
这是最干净、信号传递最可靠的方式:
- 使用 JSON 数组格式,避免 shell 解析层干扰
- 直接让 nginx 进程成为 PID 1,不经过 /bin/sh 中转
- 支持标准信号(如 docker stop 发送的 SIGTERM)直达 Nginx
示例 Dockerfile 片段:
COPY nginx.conf /etc/nginx/nginx.conf
CMD ["nginx", "-g", "daemon off;"]
如果用 shell 形式 CMD,必须加 exec
像 CMD nginx -g "daemon off;" 表面能跑,但实际 PID 1 是 /bin/sh,它只是阻塞等待 nginx;结果是:
- 容器不退出(因为 shell 挂起)
- 但 docker stop 时 SIGTERM 被 shell 截获,Nginx 收不到 → 无法优雅关闭
补救写法是显式 exec:
CMD exec nginx -g "daemon off;"验证是否生效的简单方法
容器启动后,进容器执行 ps aux,检查输出第一行:
- 正确:PID 列为 1 的进程是 nginx: master process nginx -g daemon off;
- 错误:PID 为 1 的是 /bin/sh -c nginx -g ... 或其他 shell 进程
只要 nginx 主进程是 PID 1,且不退出,容器就会长期健康运行。











