微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决在 Docker 上部署时如何重新启动 Node.Js Web 应用程序

当 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。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。