繁体   English   中英

部署在 Docker 上时如何重启 Node.Js web 应用程序

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM