/技术
分类:技术最近更新:2026-04-15浏览:1707
dockerfile# 设置基础镜像 FROM node:14.17.0 # 这个是容器中的文件目录 RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone # 设置工作目录 WORKDIR /usr/www/egg # 先拷贝package.json文件到工作目录,可以避免每次安装依赖包 COPY package.json /usr/www/egg/package.json # 安装npm依赖(使用淘宝的镜像源) RUN npm i --production --registry=https://registry.npmmirror.com # 拷贝所有源代码到工作目录 COPY . /usr/www/egg # 暴露容器端口 EXPOSE 7001 # 创建容器时运行 CMD npm run start
1、docker ps 未能看见对应启动的 egg 服务器,同时访问 7001 端口不能访问。因为 docker 容器必须有一个前台进程才是 running 状态,不然启动后就立刻关闭了,只能在 docker ps -a 里看见容器。所以配置的时候要注意检查 package.json 的命令行 --daemon 参数,如果加了这个就允许在后台模式运行,所以要在 docker 中直接去掉。
2、因为每次发布后,会生成新的镜像和容器,导致历史日志必须在老的容器里才能看到,所以要把日志文件给映射出来。在创建容器时用 -v 参数,如下:
bashdocker run -itd -p 7001:7001 -v /日常日志服务/logs/egg:/usr/www/egg/logs/egg [镜像]
这样在日志服务器里,直接查看历史的日志记录了。
3、docker 配置离不开 K8s,egg 在用 npm run start 会根据当前 CPU 内核数量启动 worker 进程。但是如果 K8S 给只给容器分了 2 核,就会出现启动报如下错误:
bash2022-07-21 09:17:57.860] [cfork:master:31] worker:50 disconnect (exitedAfterDisconnect: false, state: disconnected, isDead: false, worker.disableRefork: true) [2022-07-21 09:17:57.861] [cfork:master:31] don't fork, because worker:50 will be kill soon 2022-07-21 09:17:57,861 INFO 31 [master] app_worker#2:50 disconnect, suicide: false, state: disconnected, current workers: ["1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31","32","33","34","35","36","37","38","39","40"] 2022-07-21 09:17:58,059 ERROR 31 nodejs.AgentWorkerDiedError: [master] agent_worker#1:38 died (code: null, signal: SIGKILL) at Master.onAgentExit (/data/node_modules/egg-cluster/lib/master.js:426:17) at Master.emit (events.js:376:20) at Messenger.sendToMaster (/data/node_modules/egg-cluster/lib/utils/messenger.js:137:17) at Messenger.send (/data/node_modules/egg-cluster/lib/utils/messenger.js:102:12) at ChildProcess. (/data/node_modules/egg-cluster/lib/master.js:290:22) at Object.onceWrapper (events.js:483:26) at ChildProcess.emit (events.js:376:20) at Process.ChildProcess._handle.onexit (internal/child_process.js:277:12) name: "AgentWorkerDiedError" pid: 31
所以这个时候,你需要在命令行加上 worker 数量配置 --workers=n
bashegg-scripts start --workers=2
下一篇:微信中控台架构设计