当前位置: 首页 > news >正文

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后,如何把生产环境的配置与其他环境隔离开的解决办法。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • redis的简单操作
  • 【第十二篇】使用BurpSuite实现CSRF(实战案例)
  • docker compose部署项目—踩坑记录
  • vue2 利用网络代理axios实现开发环境前端跨域
  • 文字识别 Optical Character Recognition,OCR CTC STN
  • 【C/C++】C语言实现单链表
  • HarmonyOS实战开发DLP-如何实现一个安全类App。
  • 无参数绕过RCE
  • 掌握JWT安全
  • Git 术语及中英文对照
  • CentOS7编译ZLMediaKit并使能WebRTC
  • C语言从入门到实战————编译和链接
  • axios是什么?axios使用axios和ajax
  • c++的学习之路:12、vector(1)
  • SSL数字证书基本概念
  • [译] 怎样写一个基础的编译器
  • [译]如何构建服务器端web组件,为何要构建?
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • 【知识碎片】第三方登录弹窗效果
  • Android 控件背景颜色处理
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • eclipse(luna)创建web工程
  • ES6简单总结(搭配简单的讲解和小案例)
  • Java 最常见的 200+ 面试题:面试必备
  • JavaScript创建对象的四种方式
  • Node + FFmpeg 实现Canvas动画导出视频
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 欢迎参加第二届中国游戏开发者大会
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 免费小说阅读小程序
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 算法-图和图算法
  • 硬币翻转问题,区间操作
  • 智能合约开发环境搭建及Hello World合约
  • 长三角G60科创走廊智能驾驶产业联盟揭牌成立,近80家企业助力智能驾驶行业发展 ...
  • # 利刃出鞘_Tomcat 核心原理解析(二)
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • #数据结构 笔记一
  • $().each和$.each的区别
  • (1)(1.9) MSP (version 4.2)
  • (BFS)hdoj2377-Bus Pass
  • (Oracle)SQL优化技巧(一):分页查询
  • (第30天)二叉树阶段总结
  • (二)丶RabbitMQ的六大核心
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (简单) HDU 2612 Find a way,BFS。
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • 、写入Shellcode到注册表上线
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .net core控制台应用程序初识
  • .net 设置默认首页
  • .NET/C#⾯试题汇总系列:⾯向对象
  • .net6Api后台+uniapp导出Excel