supervisor 是容器内多进程管理最常用且轻量的方案,核心在于让它成为 pid 1 并前台运行,从而真正接管子进程的启停、监控与自动拉起;需配置 nodaemon=true、各 program 禁用 daemon 模式、显式设置 autostart/autorestart,并通过 supervisorctl 实现状态查看与运维。

Supervisor 是容器内多进程管理最常用且轻量的方案,核心在于让它成为 PID 1 并前台运行,从而真正接管子进程的启停、监控与自动拉起。
让 supervisord 成为容器主进程
Docker 只允许一个前台主进程存活,supervisord 必须以非守护模式(nodaemon=true)启动,否则容器会立即退出。配置中禁用 -d 参数,CMD 必须直接调用 supervisord 命令:
- 在
[supervisord]段明确设置nodaemon=true - Dockerfile 中 CMD 写成:
CMD ["/usr/bin/supervisord", "-c", "/etc/supervisord.conf"] - 避免使用 shell 形式如
CMD supervisord -c ...,防止 PID 不为 1
每个 program 必须适配容器环境
被管理的进程不能自行 daemon 化,否则 supervisord 无法追踪其生命周期:
- Nginx 启动命令必须加
-g "daemon off;" - Gunicorn 要用
--preload和--bind 0.0.0.0:8000,禁用--daemon - Python 或 Node.js 应用直接执行脚本,不加
&或nohup - 统一指定
autostart=true、autorestart=unexpected、startsecs=5(确保真就绪)
日志与调试要可落地
容器内看不到系统级日志,所有输出必须由 supervisord 显式捕获和落盘:
- 为每个 program 设置
stdout_logfile和stderr_logfile,路径需提前创建并赋权 - 推荐用
redirect_stderr=true合并输出,或分开便于定位问题类型 - 容器启动后,用
docker exec -it 容器名 supervisorctl status查状态 - 单服务重启:
supervisorctl restart web;看实时日志:supervisorctl tail -f web stdout
生产部署需闭环校验
自动化部署时,配置变更必须触发 reload 并验证结果,不能只写文件了事:
- 新配置放入
/etc/supervisor/conf.d/目录(支持多文件拆分) - 执行三步命令:
supervisorctl reread→supervisorctl update→supervisorctl status 服务名 - 若状态不是
RUNNING,应中断流水线并报错 - 多进程建议用
[group:app]统一管理,supervisorctl start app:*一键启停整组











