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

news2024/11/17 16:25:04

一、背景

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

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

egg-scripts start --port=5174

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

  • pm2
  • forever
  • nodemon
  • nohup

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

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

在这里插入图片描述

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1574637.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【漏洞复现】爱数云盘 Usrm_GetAllUsers 未授权访问漏洞

0x01 产品简介 爱数云盘是一个为企业协作提供高效的文档办公服务的企业云盘,主要是做私有云文件管理服务。 0x02 漏洞概述 爱数 AnyShare存在未授权漏洞,未授权的攻击者可以通过该漏洞获取用户名信息。 0x03 测绘语句 fofa: app"AISHU-AnyShare…

vue2开发好还是vue3开发好vue3.0开发路线

Vue 2和Vue 3都是流行的前端框架,它们各自有一些特点和优势。选择Vue 2还是Vue 3进行开发,主要取决于你的项目需求、团队的技术栈、以及对新特性的需求等因素。以下是一些关于Vue 2和Vue 3的比较,帮助你做出决策: Vue 2&#xff1…

MPT - 初识账户状态树(World State)

往期回顾 ETH网络中的账户ETH网络中的区块链 通过以上文章,我们了解到ETH网络中的World State是节点根据交易维护的,节点在维护Wrold State时为了方便操作会将用户状态构建成一颗树,称为账户状态树,采用一种叫做MPT的数据结构 MP…

一带一路故事绘|亚的斯亚贝巴友谊广场的绿色变迁

这是2月18日在埃塞俄比亚首都亚的斯亚贝巴友谊广场拍摄的景色。 新华社记者 李亚辉 摄 一带一路故事绘|亚的斯亚贝巴友谊广场的绿色变迁 援埃塞俄比亚河岸绿色发展项目是中国政府援建的市政园林类项目,是落实中非合作论坛北京峰会“八大行动”倡议“绿…

Python基于深度学习的屋内烟雾检测系统的研究与实现,附源码

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…

纯CSS实现未读消息显示99+

在大佬那看到这个小技巧&#xff0c;我觉得这个功能点还挺常用&#xff0c;所以给大家分享下具体的实现。当未读消息数小于100的时候显示准确数值&#xff0c;大于99的时候显示99。 1. 实现效果 2. 组件封装 <template><span class"col"><sup :styl…

【GIS前言技术】今年全球唯一一次日全食要来了!

今年全球唯一一次日全食将于北京时间4月9日凌晨上演&#xff0c;全食带扫过北美洲&#xff0c;墨西哥、美国和加拿大的众多城市都能看到这次日全食&#xff0c;发生时间为当地时间4月8日中午到下午&#xff0c;观赏性比较强。 日全食&#xff08;Eclipse&#xff09;是日食的一…

论文阅读——MVDiffusion

MVDiffusion: Enabling Holistic Multi-view Image Generation with Correspondence-Aware Diffusion 文生图模型 用于根据给定像素到像素对应关系的文本提示生成一致的多视图图像。 MVDiffusion 会在给定任意每个视图文本的情况下合成高分辨率真实感全景图像&#xff0c;或将…

Solo 开发者周刊 (第10期):Sora 之后,谁是被遗忘的?谁又是被仰望的?

这里会整合 Solo 社区每周推广内容、产品模块或活动投稿&#xff0c;每周五发布。在这期周刊中&#xff0c;我们将深入探讨开源软件产品的开发旅程&#xff0c;分享来自一线独立开发者的经验和见解。本杂志开源&#xff0c;欢迎投稿。 好文推荐 Solo 社区 x 机器之心-再谈复现 …

设置模式——备忘录模式

备忘录模式 备忘录模式&#xff08;Memento Design Pattern&#xff09;&#xff0c;也叫快照&#xff08;Snapshot&#xff09;模式。指在不违背封装原则前提下&#xff0c;捕获一个对象的内部状态&#xff0c;并在该对象之外保存这个状态&#xff0c;以便之后恢复对象为先前…

【Linux】指令

1. 简单指令 whoami 显示当前登入账号名 ls /home 现在有的用户名 adduser 用户名 新加用户&#xff08;必须在root目录下&#xff09; passwd 用户名 给这个用户设置密码 userdel -r 用户名 删除这个用户 pwd 显示当前所处路径 stat 文件名 / 文件夹名 显示文件状…

【Linux网络编程】网络编程套接字(TCP服务器)

【Linux网络编程】网络编程套接字(TCP服务器) 目录 【Linux网络编程】网络编程套接字(TCP服务器)地址转换函数关于inet_ntoa 简单的TCP网络程序TCP sockot API详解socket()bind()listen()accept();connect 完整的TCP服务器代码&#xff08;线程池版&#xff09; 作者&#xff1…

云谈网页聊天室的web自动化测试 性能测试 (包含测试代码和测试的详细过程)

概要 项目名称&#xff1a;云谈网页聊天室测试日期&#xff1a;2024-03-05测试人员&#xff1a;汪汪miao~测试类型&#xff1a;功能测试、集成测试&#xff0c;接口测试、性能测试测试框架&工具&#xff1a;Selenium、Junit、LoadRunner 项目背景 云谈网页聊天室是一款实…

【算法】两数之和(暴力求解+哈希表)

本题来源---《两数之和》。 题目描述 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里…

OPPO云VPC网络实践

1 OPPO 云网络现状 随着OPPO业务的快速发展&#xff0c;OPPO云规模增长迅速。大规模虚拟实例的弹性伸缩、低延时需求对网络提出了诸多挑战。原有基于VLAN搭建的私有网络无法解决这些问题&#xff0c;给网络运维和业务的快速上线带来了挑战。 梳理存在的主要问题如下&#xf…

redis 集群模式(redis cluster)介绍

目录 一 redis cluster 相关定义 1&#xff0c; redis cluster 是什么 2&#xff0c;redis 集群的组成 3&#xff0c;集群的作用 4&#xff0c;集群架构图 二 Redis集群的数据分片 1&#xff0c;哈希槽是什么 2&#xff0c;哈希槽如何排布 3&#xff0c;Redis集…

(源码+部署+讲解)基于Springboot+vue校园设施报修系统的设计与实现

前言 &#x1f497;博主介绍&#xff1a;✌专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f447;&#x1f3fb; 精彩专栏 推荐订阅&#x1f447;&#x1f3fb; 2024年Java精品实战案例《100套》 &#x1f345;文末获取源码联系&#x1f345; &#x1f31f…

freeRTOS-day4

1.总结二进制信号量和计数型信号量的区别&#xff0c;以及他们的使用场景。 二进制信号量只有两个状态&#xff1a;0和1。它通常用于线程同步&#xff0c;表示某个线程执行完毕&#xff0c;另一个线程才能开始执行。这种特性使得二进制信号量特别适用于互斥访问共享资源的场景…

ensp 通过cloud连接交换,通过本机直连telnet交换机

#连接图 #cloud配置 绑定本机一个虚拟网卡&#xff0c;勾选双向通信&#xff0c;这样就可以通过真机直接telent到交换机 #交换机配置 #需要将管理口ip配置为绑定的虚拟网卡同网段的IP&#xff0c;便于直接链接 system-view sysname s5700 undo info-center en telnet server…