nodejs应用程序以守护进程daemon的方式启动,容器化部署的时候一直部署出错,导致无法成功启动程序。

本文主要是介绍nodejs应用程序以守护进程daemon的方式启动,容器化部署的时候一直部署出错,导致无法成功启动程序。,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、背景

nodejs应用程序使用Egg.js 框架脚本命令,见package.json:
在这里插入图片描述

"scripts": {"debug": "egg-bin debug","clean": "easy clean","build": "easy build prod","start": "egg-scripts start --daemon --port=5174","dev": "egg-bin dev --port 4000","lint": "eslint .","stop": "egg-scripts stop","fix": "eslint --fix .","ii": "npm install --registry https://registry.npm.taobao.org"},

egg-scripts start --daemon --port=5174 命令中的 --daemon 参数通常用于将应用程序以守护进程的方式启动,即在后台运行。

当使用ecs部署的时候,程序运行正常。
可是,当容器化之后,启动未见错误日志,但是容器一会儿就挂了。

二、问题描述

1、非容器启动程序

需要以守护进程的方式启动程序,故增加–daemon 参数启动。

> npm start> player_egg@1.0.0 start
> egg-scripts start --daemon --port=5174[egg-scripts] Starting egg application at /home/xxx/Documents/code/webPlayer
[egg-scripts] Run node /home/xxx/Documents/code/webPlayer/node_modules/egg-scripts/lib/start-cluster {"port":5174,"baseDir":"/home/xxx/Documents/code/webPlayer","framework":"/home/xxx/Documents/code/webPlayer/node_modules/egg","title":"egg-server-player_egg"} --title=egg-server-player_egg
[egg-scripts] Save log file to /home/xxx/logs
[egg-scripts] Wait Start: 1...
[egg-scripts] egg started on http://127.0.0.1:5174

在这里插入图片描述
可以看到,程序进程启动成功!

在这里插入图片描述

2、容器启动程序

这里省去如何制作docker容器的详细过程。

docker run -it --name=webplay -p 5174:5174 -v /home/xxx/Documents/code/webPlayer/log:/root/logs xxx/webplay:1.0.0 /bin/sh

启动的时候对容器日志进行持久化,便于观察问题。

在这里插入图片描述

查看日志:

cat /home/xxx/Documents/code/webPlayer/log/master-stdout.log2024-04-07 02:17:39,240 INFO 48 [egg:loader] Controller loaded: /opt/app/controller
2024-04-07 02:17:39,247 INFO 48 [egg:core] dump config after load, 4ms
2024-04-07 02:17:39,254 INFO 48 [egg-mongoose] starting...
2024-04-07 02:17:39,283 INFO 48 [egg:core:ready_stat] end ready task /opt/node_modules/egg-mongoose/lib/mongoose.js:49:9, remain ["/opt/node_modules/egg-watcher/lib/init.js:15:14","/opt/node_modules/egg-mongoose/lib/mongoose.js:91:7","/opt/node_modules/egg-core/lib/egg.js:303:10"]
2024-04-07 02:17:39,283 INFO 48 [egg:core:ready_stat] end ready task /opt/node_modules/egg-core/lib/egg.js:303:10, remain ["/opt/node_modules/egg-watcher/lib/init.js:15:14","/opt/node_modules/egg-mongoose/lib/mongoose.js:91:7"]
2024-04-07 02:17:39,289 INFO 48 [egg-mongoose] mongodb://192.168.50.12:50000/webplay connected successfully
2024-04-07 02:17:39,290 INFO 48 [egg-mongoose] instance[0] start successfully
2024-04-07 02:17:39,292 INFO 48 [egg:core:ready_stat] end ready task /opt/node_modules/egg-mongoose/lib/mongoose.js:91:7, remain ["/opt/node_modules/egg-watcher/lib/init.js:15:14"]
2024-04-07 02:17:39,294 INFO 48 [egg-watcher:application] watcher start success
2024-04-07 02:17:39,294 INFO 48 [egg:core:ready_stat] end ready task /opt/node_modules/egg-watcher/lib/init.js:15:14, remain []
2024-04-07 02:17:39,306 INFO 29 [master] app_worker#2:48 started at 5174, remain 0 (2337ms)
2024-04-07 02:17:39,307 INFO 29 [master] egg started on http://127.0.0.1:5174 (2982ms)

在这里插入图片描述

总结: 可以看到,程序启动了期望的5174进程,启动的过程中连接Mongodb数据库也Ok,整个过程并没有出现任何错误信息。

可是最后docker容器却挂了。

三、解决办法

当在容器中运行这个命令时,如果设置了 --daemon 参数,应用程序确实会在后台运行,这意味着它不会占用容器的主进程。然而,在Docker容器中,主进程是容器的生命周期的一部分。如果主进程结束或变为后台进程,容器可能会认为应用程序已经运行完成,并停止容器。

这可能是导致容器启动应用程序后停止的原因。要解决这个问题,您可以移除 --daemon 参数,确保 egg-scripts 启动的进程是容器的主进程。这样,应用程序就会在前台运行,并且容器会保持运行状态。

修改后的启动命令应该是:

egg-scripts start --port=5174

当然,你还有其他解决办法:

  • pm2
  • forever
  • nodemon
  • nohup

修改package.json,容器化部署的时候,不能以守护进程的方式启动。

你也可以新增一个启动脚本。

在这里插入图片描述

下一篇,我们将介绍Nodejs应用程序容器化部署到k8s后,如何把生产环境的配置与其他环境隔离开的解决办法。

这篇关于nodejs应用程序以守护进程daemon的方式启动,容器化部署的时候一直部署出错,导致无法成功启动程序。的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/886105

相关文章

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

使用Sentinel自定义返回和实现区分来源方式

《使用Sentinel自定义返回和实现区分来源方式》:本文主要介绍使用Sentinel自定义返回和实现区分来源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Sentinel自定义返回和实现区分来源1. 自定义错误返回2. 实现区分来源总结Sentinel自定

Springboot处理跨域的实现方式(附Demo)

《Springboot处理跨域的实现方式(附Demo)》:本文主要介绍Springboot处理跨域的实现方式(附Demo),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录Springboot处理跨域的方式1. 基本知识2. @CrossOrigin3. 全局跨域设置4.

springboot security使用jwt认证方式

《springbootsecurity使用jwt认证方式》:本文主要介绍springbootsecurity使用jwt认证方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录前言代码示例依赖定义mapper定义用户信息的实体beansecurity相关的类提供登录接口测试提供一

springboot security之前后端分离配置方式

《springbootsecurity之前后端分离配置方式》:本文主要介绍springbootsecurity之前后端分离配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的... 目录前言自定义配置认证失败自定义处理登录相关接口匿名访问前置文章总结前言spring boot secu

SpringBoot中封装Cors自动配置方式

《SpringBoot中封装Cors自动配置方式》:本文主要介绍SpringBoot中封装Cors自动配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot封装Cors自动配置背景实现步骤1. 创建 GlobalCorsProperties

Flutter打包APK的几种方式小结

《Flutter打包APK的几种方式小结》Flutter打包不同于RN,Flutter可以在AndroidStudio里编写Flutter代码并最终打包为APK,本篇主要阐述涉及到的几种打包方式,通... 目录前言1. android原生打包APK方式2. Flutter通过原生工程打包方式3. Futte

tomcat多实例部署的项目实践

《tomcat多实例部署的项目实践》Tomcat多实例是指在一台设备上运行多个Tomcat服务,这些Tomcat相互独立,本文主要介绍了tomcat多实例部署的项目实践,具有一定的参考价值,感兴趣的可... 目录1.创建项目目录,测试文China编程件2js.创建实例的安装目录3.准备实例的配置文件4.编辑实例的

SpringBoot配置Ollama实现本地部署DeepSeek

《SpringBoot配置Ollama实现本地部署DeepSeek》本文主要介绍了在本地环境中使用Ollama配置DeepSeek模型,并在IntelliJIDEA中创建一个Sprin... 目录前言详细步骤一、本地配置DeepSeek二、SpringBoot项目调用本地DeepSeek前言随着人工智能技

SpringBoot启动报错的11个高频问题排查与解决终极指南

《SpringBoot启动报错的11个高频问题排查与解决终极指南》这篇文章主要为大家详细介绍了SpringBoot启动报错的11个高频问题的排查与解决,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一... 目录1. 依赖冲突:NoSuchMethodError 的终极解法2. Bean注入失败:No qu