在 kubernetes 环境中运行时 nodemon 未启动
Posted
技术标签:
【中文标题】在 kubernetes 环境中运行时 nodemon 未启动【英文标题】:nodemon not starting when run in kubernetes environment 【发布时间】:2021-12-16 19:57:17 【问题描述】:我正在将一个 nodejs 应用程序容器化以在 GKE 上运行。 package.json 的脚本部分如下所示
"scripts":
"dev": "npm-run-all --parallel dev:build-server dev:build-client dev:server",
"dev:server": "nodemon -L --watch build --exec node build/bundle.js",
"dev:build-server": "webpack --config webpack.server.js --watch",
"dev:build-client": "webpack --config webpack.client.js --watch"
,
所以当我使用npm run dev
来启动它们时。
这在 VM 上运行时可以完美运行。 但是当在 kubernetes 中作为容器运行时,nodemon 进程将不会启动。 它也不监听端口。它在浏览器上给出 502 状态错误
但是当你 ssh 到 pod 并尝试运行命令时,它会在 3001 端口上启动 process.listens,但显然它给出了在浏览器上找不到的路由。因为它们没有按预期链接。
下面是dockerfile
FROM node:10.19-stretch
ENV USER="vue" UID="1001"
RUN apt-get update --fix-missing
RUN apt-get install -yq curl
RUN rm /bin/sh && ln -s /bin/bash /bin/sh && \
mkdir -p /opt/vue && \
addgroup --system -gid $UID $USER && \
adduser --system --uid $UID --gid $UID $USER
WORKDIR /opt/vue
COPY dashboard/. /opt/vue/
RUN npm cache clean --force && \
npm install && \
npm cache verify && \
chown $USER.$USER -R /opt/vue
USER $USER
EXPOSE 3001
# ENTRYPOINT ["/usr/bin/dumb-init","--"]
# CMD ["npm run dev"]
CMD ["npm", "run", "dev" ]
尝试使用基本图像 (node:10.19-stretch,node:10.19.0-alpine3.11
)
有些人建议安装 inotify,但即使这样也没有用。
我错过了什么。请帮忙。
更新---
当在 docker 或 kubernetes 中运行时,standerout 日志会这样说 没有错误(启用详细输出)
[nodemon] Looking in package.json for nodemonConfig
Usage: nodemon [nodemon options] [script.js] [args]
See "nodemon --help" for more.
[nodemon] exiting
【问题讨论】:
启动容器时 docker log 说了什么? @eol 没有在 docker 上运行这个。直接在 kubrnetes 上运行。 Kubernetes 日志没有错误 好的,但是你看到像[nodemon] starting <your-script.js>
这样的成功消息还是根本没有输出?
nodemon 没有输出...当它在 vm 上运行时,它显示正在侦听端口 3001 和 nodemon 版本等输出。但在 kubernetes 中什么都没有。所有其他进程都说明成功
您能否提供在虚拟机实例中运行它的确切步骤?
【参考方案1】:
经过一些同行评审并将其发布在其他网络上找到了正确答案。
背后的问题很明显。 在脚本部分,所有 dev:* 脚本都是并行运行的。因此,当两个构建步骤运行时,nodemon 服务正在尝试启动该服务。并且由于 build/bundle.json 不存在,它给出了一个未找到的文件。但是 nodemon 认为它是无效的参数并给出命令帮助。
所以我所做的是通过运行在 docker 文件中添加构建步骤
npm run dev
然后在 CMD 上添加
npm run prod:server
这实际上也加快了启动时间。
这里是修改的 dockerfile 部分。
RUN npm cache clean --force && \
npm install && \
npm cache verify && \
chown $USER.$USER -R /opt/vue
USER $USER
EXPOSE 3001
CMD ["npm", "run", "prod:server" ]
我还删除了 nodemon,因为它不需要。因为文件无论如何都不会更改,而且它们太庞大了
"scripts":
"dev": "npm-run-all --parallel dev:build-server dev:build-client",
"prod:server": "node build/bundle.js",
"dev:build-server": "webpack --config webpack.server.js --watch",
"dev:build-client": "webpack --config webpack.client.js --watch"
,
终于……!!中提琴..它奏效了。
感谢所有为此付出宝贵时间的人。
【讨论】:
运行nodejs应用时推荐使用pm2 runtime 是的。您的观点在虚拟机或裸机服务器上运行时有效。但是,当谈到容器时,我们应该考虑宝贵的资源。在这方面,甚至应该删除 pm2、nodemon 和许多其他不需要的库以节省资源。无论如何,我们可能不需要重新加载 nodemon 来更改容器中的文件。因为它们没有改变。如果需要更改,则必须通过单独的部署来完成。你怎么看@LakinduAkash 据我所知和经验,对于生产环境,pm2 非常轻量级。是的,nodemon 当然可以删除并设置为开发依赖项。当你运行 npm install --only=prod 时,它只会安装依赖列表下声明的有限包。 而且,是的,在大多数情况下,更改文件意味着新的 docker 映像,除非您的应用程序没有检测实时更改的特定要求。典型的 ci/cd 管道检测代码更改并构建新的 docker 映像并部署新版本。以上是关于在 kubernetes 环境中运行时 nodemon 未启动的主要内容,如果未能解决你的问题,请参考以下文章