[英]How to restart Node.Js web app when deployed on Docker
当 GET 请求具有诸如...?foo=12之类的特定查询参数时,我正在尝试自行重新启动 NODE.js web 应用程序。 然后我通过 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, '-foo', 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 应用程序之外,运行另一个进程来阻止 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。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.