javascript - 在 node.js 中捕获 docker-compose 关闭事件
问题描述
我一直在尝试在我的 node.js 应用程序中捕获关闭命令,以便在终止应用程序之前整理连接。
在生产中,我的应用程序使用 docker swarm,我可以看到 SIGTERM 通过以下方式触发:
process.on('SIGTERM', function() {});
但是,在我的开发环境中,我正在使用docker-compose run
and 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();
})
解决方案
#!/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 并杀死节点
推荐阅读
- python - Dash 应用程序 - 是否可以将用户当前的所有选择导入/导出到文件?
- javascript - 最佳实践 - 将值保存在客户端,或将它们与请求一起发送以通过服务器响应检索回来
- android - Flutter 计算器应用程序 - 如何在没有右括号的情况下进行计算?
- angular - matTooltip 未显示在对话框窗口中
- mongodb - Or 语句只返回第一个结果(应该是 2)
- gnome - gnome MATE 桌面环境 alt_L 键重新映射
- bash - 查找仅包含隐藏文件和/或隐藏目录的所有目录
- css - 如何防止 Angular 元素(Web 组件)覆盖其父元素的样式
- java - 将 List 转换为 akka.japi.Function[akka.http.javadsl.model.HttpRequest, java.util.concurrent.CompletionStage[akka.http.javadsl.model.HttpResponse]]*
- fastapi - FastAPI - 从自动生成的文档中排除 Pydantic 模型的方法