首页 > 解决方案 > 在 node.js 中捕获 docker-compose 关闭事件

问题描述

我一直在尝试在我的 node.js 应用程序中捕获关闭命令,以便在终止应用程序之前整理连接。

在生产中,我的应用程序使用 docker swarm,我可以看到 SIGTERM 通过以下方式触发:

process.on('SIGTERM', function() {});

但是,在我的开发环境中,我正在使用docker-compose runand docker-compose down,这似乎不会触发我的SIG*捕获(我有一个本地版本的 rabbitMQ 正在运行,SIG事件在关闭之前也会发布)。

我在 Dockerfile 和 docker-compose 文件中运行ubuntu:bionic映像,我有init: true。我的 Docker 引擎是18.09.2,compose 是1.23.2版本:“3.7”在我的 compose 文件的顶部。

这些是我在 index.js 中的所有捕获事件:

process.on('exit', () => {
  reporter.ossEvent('APP STOPPED exit');
  shutdown();
});

process.on('SIGINT', () => {
  reporter.ossEvent('APP STOPPED SIGINT');
  shutdown();
});

process.on('SIGTERM', function() {
  reporter.ossEvent('APP STOPPED SIGTERM');
  shutdown();
});

process.on('SIGUSR1', () => {
  reporter.ossEvent('APP STOPPED SIGUSR2');
  shutdown();
});

process.on('SIGUSR2', () => {
  reporter.ossEvent('APP STOPPED SIGUSR2');
  shutdown();
})

标签: javascriptnode.jsdockerdocker-compose

解决方案


#!/bin/bash
set -e

_kill_procs() {
  kill -TERM $node
}

# Relay quit commands to processes
trap _kill_procs SIGTERM SIGINT

dumb-init -- node ./build/index.js $@ &
node=$!

#sleep infinity

echo 'Starting node process now'

wait $node

上面这段代码是监听 SIGTERM AND SIGKILL 并杀死节点


推荐阅读