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

一、背景

nodejs应用程序使用Egg.js 框架脚本命令,见package.json:

bash 复制代码
"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 参数启动。

bash 复制代码
> 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容器的详细过程。

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

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

查看日志:

bash 复制代码
cat /home/xxx/Documents/code/webPlayer/log/master-stdout.log

2024-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 启动的进程是容器的主进程。这样,应用程序就会在前台运行,并且容器会保持运行状态。

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

bash 复制代码
egg-scripts start --port=5174

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

  • pm2
  • forever
  • nodemon
  • nohup

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

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

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

相关推荐
狗头大军之江苏分军3 分钟前
告别旧生态:Ant Design 6 不再支持 IE 与现代前端趋势解读
前端·javascript·后端
C_心欲无痕4 分钟前
nginx - 开启 gzip 压缩
运维·前端·nginx
闲云一鹤9 分钟前
2026 最新 ComfyUI 教程 - 本地部署 AI 生图模型 - Z-Image-Turbo
前端·人工智能·ai编程
开开心心_Every11 分钟前
安卓后台录像APP:息屏录存片段,行车用
java·服务器·前端·学习·eclipse·edge·powerpoint
狗头大军之江苏分军13 分钟前
Ant Design 6.0 正式发布:从 V5 到 V6 有哪些变化?
前端
优弧20 分钟前
Claude 终于对普通人下手了!Cowork 发布,你的最强 AI 打工搭子来了!
前端·后端
Zoey的笔记本43 分钟前
敏捷与稳定并行:Scrum看板+BPM工具选型指南
大数据·前端·数据库·python·低代码
文心快码BaiduComate1 小时前
0代码手写!体验百度Comate的“魔法”:我造了个会理解情绪的中介层
前端·程序员·前端框架
3824278271 小时前
表单提交验证:onsubmit与return详解
前端·javascript·html
前端小蜗1 小时前
普通前端程序员的 2025:没什么大胜利,但也没被生活击倒
前端