You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker容器中Nodemon无法正常停止的解决方案咨询

问题

Docker容器可正常运行,Nodemon能监听代码变更自动更新应用,但执行docker compose down时,Node应用无法正常退出,需等待10秒默认超时后被SIGKILL终止,日志显示exited with code 0。

已在代码中监听SIGTERM和SIGINT信号,但回调未触发:

process.on('SIGTERM', gracefulShutdown(server)) // 回调未被调用
process.on('SIGINT', gracefulShutdown(server))

不使用Nodemon时,容器可在0.5秒内正常停止,确定问题根源在Nodemon。


解决方法

1. 修正信号监听的写法

当前代码中直接执行了gracefulShutdown(server),会导致函数在注册监听时就被调用,而非信号触发时执行。应改为传递函数引用:

process.on('SIGTERM', () => gracefulShutdown(server))
process.on('SIGINT', () => gracefulShutdown(server))

2. 配置Nodemon转发信号

修改npm的dev脚本,添加--signal SIGTERM参数,让Nodemon将收到的SIGTERM信号传递给Node子进程:

"dev": "nodemon --signal SIGTERM"

3. 确保Nodemon接收信号的正确方式

在Docker Compose中,用exec模式启动命令(数组形式),避免npm作为PID 1进程拦截信号:

# 修改server服务的command
command: ["npx", "nodemon", "--signal", "SIGTERM"]

或者保持npm脚本,改用数组形式调用:

command: ["npm", "run", "dev"]

4. 可选:调整容器停止超时时间

如果需要给优雅关闭预留更合理的时间,可在server服务中添加:

stop_grace_period: 5s

内容的提问来源于stack exchange,提问作者Ngọc Nguyễn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 02:35:59