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
是兼容版本。
我在 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.
我使用命令检查了日志
$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 版本不兼容。这似乎类似于这个答案:
你能用它做什么?
来自
RUN npm install pm2@x.y.z -g
其中 x.y.z
是兼容版本。