如何通过Node.js应用的Ctrl+C信号停止Docker Compose?
实现Node.js停止时自动关闭Docker Compose容器
方法1:在Node.js代码中监听终止信号并控制Compose
Node.js可以监听SIGINT信号(Ctrl+C触发的终止信号),收到信号时执行docker-compose down命令,再退出进程。
示例代码:
const { exec } = require('child_process'); // 监听Ctrl+C触发的SIGINT信号 process.on('SIGINT', () => { console.log('正在停止Docker Compose容器...'); // 执行容器停止命令 exec('docker-compose down', (error, stdout, stderr) => { if (error) { console.error(`停止容器出错: ${error.message}`); } else if (stderr) { console.error(`命令执行错误: ${stderr}`); } else { console.log('Docker Compose容器已停止'); } // 退出Node.js进程 process.exit(0); }); }); // 你的Node.js应用业务逻辑 console.log('Node.js应用启动成功'); // ...
如果你的启动脚本已经以后台模式(-d参数)启动了Compose,上面的代码就能在Node进程终止时自动执行容器停止操作。
方法2:用Shell脚本封装启动流程,通过trap捕获信号
如果你的启动逻辑写在Shell脚本中,可以用trap命令捕获INT信号,触发清理操作时同时停止Node进程和Compose容器。
示例启动脚本(start.sh):
#!/bin/bash # 后台启动Docker Compose docker-compose up -d # 启动Node.js应用并记录进程PID node app.js & NODE_PID=$! # 定义清理函数 cleanup() { echo "正在清理资源..." # 终止Node进程 kill $NODE_PID # 停止Docker Compose容器 docker-compose down exit 0 } # 捕获Ctrl+C触发的INT信号,执行清理函数 trap cleanup INT # 等待Node进程结束 wait $NODE_PID
使用时先给脚本添加执行权限:chmod +x start.sh,再运行./start.sh即可。按下Ctrl+C时,脚本会自动执行清理流程。
注意事项
- 如果Docker Compose是前台启动(未加
-d参数),需调整Shell脚本的进程管理逻辑,比如用pkill直接终止Compose进程。 - 确保Node进程与Compose使用相同的工作目录,避免
docker-compose命令找不到配置文件。 - 若Node应用本身运行在Docker容器中,需挂载宿主机的Docker socket(
/var/run/docker.sock),才能让容器内的docker-compose命令控制宿主机的容器。
内容的提问来源于stack exchange,提问作者Sajjad Brj
相关产品推荐
相关产品推荐

