背景:
公司业务上线方式使用Gitlab-ci + helm 部署到k8s集群中
问题:
近几天在配置一个node项目上k8s,在Dockerfile中配置启动命令
RUN pm2 start app.js
结果日志没有报错,显示启动成功了。
结果查看容器服务中pod服务一直显示503,刚开始以为健康检查接口不对或者有鉴权,于是将服务部署到测试服务器上发现接口没有鉴权且返回200.
那么问题一定是容器启动的时候加入后台或退出了。查询了各种资料发现了需要使用pm2-runtime
最后Dockerfile 中启动命令修改为:
······
CMD ["pm2-runtime", "app.js", "--instances", "2", "--no-autorestart", "--max-memory-restart", "1G"]
······
pm2和pm2-runtime之间的主要区别
- pm2-runtime是为Docker容器设计的,它将应用程序置于前台,从而使容器保持运行状态,
- pm2专为在后台发送或运行应用程序的正常使用而设计。
简单来说,容器的寿命就是CMD
或entrypoint
的寿命。
例如
Dockerfile
FROM node:alpine
RUN npm install pm2 -g
COPY . /app
WORKDIR /app
CMD [ "pm2", "start","/app/server.js"]
在这种情况下,容器将在运行过程后立即死亡。
要解决此问题,您需要 pm2-runtime
FROM node:alpine
RUN npm install pm2 -g
COPY . /app
WORKDIR /app
ENV NODE_ENV=development
CMD [ "pm2-runtime", "start","/app/bin/www"]
随着容器继续运行并分配tty会话。