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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 22:55:17