Kubenetes上的Node.js应用程序崩溃,出现错误SyntaxError:PM2的意外令牌导入



我在Kubernetes中部署了一个Node.js应用程序,我的docker文件如下所示:

FROM node:8.9.4
RUN mkdir -p /opt/amy-app-folder
RUN chown -R node:node /opt
WORKDIR /opt/my-app-folder
COPY dist /opt/my-app-folder
RUN npm install pm2 -g
EXPOSE 8000
USER node
CMD ["pm2-docker", "bin/www.js"]

在我最近为应用程序进行部署之前,这一直运行良好。我配置CI/CD作业的方式是,一旦我将PR合并到development分支,它就会构建和部署应用程序。当我检查pod时,它显示CrashLoopBackOff是我的应用程序正在运行的pod的状态。

我使用命令检查日志

$kubectl logs -f my-app-name-qa-d8744bf4f-sh6ks -n wea-qa --tail 1000

它显示pm2已崩溃,并显示以下错误消息

2022-03-21T11:50:46: PM2 log: App [www:0] starting in -fork mode-
2022-03-21T11:50:46: PM2 log: App [www:0] online
/usr/local/lib/node_modules/pm2/lib/ProcessContainerFork.js:30
import(url.pathToFileURL(process.env.pm_exec_path));
^^^^^^
SyntaxError: Unexpected token import
at createScript (vm.js:80:10)
at Object.runInThisContext (vm.js:139:10)
at Module._compile (module.js:607:28)
at Object.Module._extensions..js (module.js:654:10)
at Module.load (module.js:556:32)
at tryModuleLoad (module.js:499:12)
at Function.Module._load (module.js:491:3)
at Function.Module.runMain (module.js:684:10)
at startup (bootstrap_node.js:187:16)
at bootstrap_node.js:608:3
2022-03-21T11:50:46: PM2 log: App [www:0] exited with code [1] via signal [SIGINT]
2022-03-21T11:50:46: PM2 log: Script /opt/my-appl/bin/www.js had too many unstable restarts (16). Stopped. "errored"
2022-03-21T11:50:50: PM2 log: 0 application online, retry = 3
2022-03-21T11:50:52: PM2 log: 0 application online, retry = 2
2022-03-21T11:50:54: PM2 log: 0 application online, retry = 1
2022-03-21T11:50:56: PM2 log: 0 application online, retry = 0
2022-03-21T11:50:56: PM2 log: Stopping app:www id:0
2022-03-21T11:50:56: PM2 error: app=www id=0 does not have a pid
2022-03-21T11:50:57: PM2 log: PM2 successfully stopped

我在代码中所做的唯一更改是添加了一个console.log,稍后会将其删除。现在,这是我的应用程序的staging版本,我用master分支检查了代码,它在生产中运行良好。代码没有变化,所以我被困在这里,不知道下一步该怎么办。当吊舱停止时,我无法进入吊舱并运行命令。我再次重新部署了代码,但pod仍然在启动,然后就崩溃了。

我可以在我的本地机器上运行代码,在那里我不使用Kubernetes或Docker。我的本地节点版本是12.0.0

有人能帮我解决这个问题吗?提前谢谢。

以下是我认为您的应用程序正在发生的情况:

问题不在于你的应用程序的代码

但是Nodejs在尝试运行CCD_ 9时没有识别出CCD_。nodejs v8.x版本可能不支持以这种方式导入模块。

现在,为什么这现在失败了

Docker正在安装最新版本的pm2来运行您的应用程序:

RUN npm install pm2 -g

因此,当您在代码中添加某些内容时,新构建必须下载了pm2的新版本,该版本与nodejs版本不兼容。这似乎与这个答案类似:https://stackoverflow.com/a/59840576/1971120

你能用这个做什么

根据这个答案(另一个问题(,我建议您将nodejs升级到+v13(使用LTS版本是理想的(,但如果您不能做到这一点,请在docker描述符中使用兼容的pm2版本,如下所示:

RUN npm install pm2@x.y.z -g

其中x.y.z是兼容版本。

最新更新