Node.js app on Kubenetes crashing with error SyntaxError: Unexpected token import for PM2

Node.js app on Kubenetes crashing with error SyntaxError: Unexpected token import for 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 分支,它就会构建和部署应用程序。当我检查 pods 时,它显示 CrashLoopBackOff 作为我的应用程序处于 运行ning.

的 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 分支检查了代码,在生产环境中 运行ning 没问题。代码没有变化,所以我被困在这里,不知道下一步该怎么做。当 pod 停止时,我无法进入 pod 和 运行 命令。我再次重新部署了代码,但是 pod 仍然在启动,然后它就崩溃了。

我能够 运行 我本地机器上的代码,但我没有使用 Kubernetes 或 Docker。我本地的node版本是12.0.0

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

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

问题不在于您的应用代码

...但是 Nodejs 在尝试 运行 pm2 时无法识别 import。 nodejs 版本 v8.x 可能不支持以这种方式导入模块。

现在,为什么失败了现在

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

RUN npm install pm2 -g

因此,当您向代码中添加内容时,新版本必须下载新版本的 pm2,该版本与该 nodejs 版本不兼容。这似乎类似于这个答案:

你能用它做什么?

来自 (另一个问题),我建议您将 nodejs 升级到 +v13(使用 LTS 版本是理想的),但如果您不能这样做,请坚持使用兼容的 pm2 docker 描述符中的版本如下:

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

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