问题描述
当 GET 请求具有某个查询参数(例如 ...?foo=12 )时,我正在尝试自行重新启动 NODE.js 网络应用程序。然后我通过 NODE.JE 过程参数将此 foo 值传递给新实例。我使用以下代码在没有外部依赖项(pm2,永远)的情况下工作:
app.get('*',(req:IncomingMessage,res:ServerResponse,next:()=>void) => {
process.on('exit',() => {
const cmd:string = process.argv.shift() ?? '';
const foovalue:string = getFooParameterValue();
let argv = process.argv;
if(foovalue){
argv = [...process.argv,'-foo',foovalue];
}
const argv : string[] = [...process.argv,foovalue];
childProcess.spawn(cmd,argv,{
cwd: process.cwd(),detached: true,stdio: 'inherit',});
});
process.exit();
});
一切都在本地运行良好,但是当我构建一个映像并在 docker 上运行它时,它不起作用。我认为 docker 容器附加到第一个实例进程,当我退出第一个实例时,容器也会停止而不是启动第二个实例。我的目标是拥有它,这样我就可以像在本地部署时一样在 bash 进程中运行 NODE.JS 应用程序。 如果我丢弃该代码并使用 pm2 一切都按预期工作并重新启动,但我找不到一种方法将 ...?foo=123 信息传递给自 NODE. JS 工艺参数不适用。我也尝试过 process.env,但我相信它不会跨进程共享。我可以选择将文件保存为计划“d”,但想知道是否可以以更简洁的方式做到这一点。
解决方法
在我思考得更好并进行了更多调查之后,我决定在我的 Dockerfile 中,除了运行我的 Node.js 应用程序之外,还运行另一个进程,以防止在我重新启动 Node.Js 应用程序时 docker 容器停止。
>Dockerfile
(...)
CMD ["/app/bash-script.sh"]
bash-script.sh
//run Node.js app
npm run start
tail -f /dev/null &
bash_process_id=$!
wait $bash_process_id;
这样做的好处是我可以在问题中使用“child_process”代码。重新启动 Node.js 应用程序并通过参数传递一些信息。我也可以使用 process.env。