背景:
    公司业务上线方式使用Gitlab-ci + helm 部署到k8s集群中

    问题:
    近几天在配置一个node项目上k8s,在Dockerfile中配置启动命令
    RUN pm2 start app.js
    结果日志没有报错,显示启动成功了。
    image.png

    结果查看容器服务中pod服务一直显示503,刚开始以为健康检查接口不对或者有鉴权,于是将服务部署到测试服务器上发现接口没有鉴权且返回200.

    image.png
    那么问题一定是容器启动的时候加入后台或退出了。查询了各种资料发现了需要使用pm2-runtime

    最后Dockerfile 中启动命令修改为:

    1. ······
    2. CMD ["pm2-runtime", "app.js", "--instances", "2", "--no-autorestart", "--max-memory-restart", "1G"]
    3. ······

    pm2和pm2-runtime之间的主要区别

    • pm2-runtime是为Docker容器设计的,它将应用程序置于前台,从而使容器保持运行状态,
    • pm2专为在后台发送或运行应用程序的正常使用而设计。

    简单来说,容器的寿命就是CMDentrypoint的寿命。

    例如

    1. Dockerfile
    2. FROM node:alpine
    3. RUN npm install pm2 -g
    4. COPY . /app
    5. WORKDIR /app
    6. CMD [ "pm2", "start","/app/server.js"]

    在这种情况下,容器将在运行过程后立即死亡。
    要解决此问题,您需要 pm2-runtime

    1. FROM node:alpine
    2. RUN npm install pm2 -g
    3. COPY . /app
    4. WORKDIR /app
    5. ENV NODE_ENV=development
    6. CMD [ "pm2-runtime", "start","/app/bin/www"]

    image.png
    随着容器继续运行并分配tty会话。