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
相关产品推荐
相关产品推荐

