docker - 如何使用运行 pm2 的 nodejs 为 docker 设置 pm2-logrotate?
问题描述
我有来自 keymetrics/pm2:8-jessie 的 docker 映像,并使用 pm2 很好地运行我的 nodejs 应用程序。我尝试添加 pm2-logrotate 来调整带有日期的日志。我在 Dockerfile 中添加了以下内容。可以启动模块 pm2-logrotate 但目标 PID 为空。任何人都可以帮忙吗?
FROM keymetrics/pm2:8-jessie
RUN npm install
RUN pm2 install pm2-logrotate
RUN pm2 set pm2-logrotate:retain 90
RUN pm2 set pm2-logrotate:dateFormat YYYY-MM-DD_HH-mm-ss
RUN pm2 set pm2-logrotate:max_size 10M
RUN pm2 set pm2-logrotate:rotateInterval 0 0 * * *
RUN pm2 set pm2-logrotate:rotateModule true
RUN pm2 set pm2-logrotate:workerInterval 10
ENV NODE_ENV=$buildenv
ENV NPM_CONFIG_LOGLEVEL warn
CMD ["sh", "-c", "pm2-runtime start pm2.${NODE_ENV}.config.js"]
下午2点
┌──────────────┬────┬─────────┬─────────┬─────┬────────┬─────────┬────────┬─────┬────────────┬──────┬──────────┐
│ App name │ id │ version │ mode │ pid │ status │ restart │ uptime │ cpu │ mem │ user │ watching │
├──────────────┼────┼─────────┼─────────┼─────┼────────┼─────────┼────────┼─────┼────────────┼──────┼──────────┤
│ app_server │ 1 │ 1.0.0 │ cluster │ 150 │ online │ 1 │ 2h │ 0% │ 104.4 MB │ root │ disabled │
└──────────────┴────┴─────────┴─────────┴─────┴────────┴─────────┴────────┴─────┴────────────┴──────┴──────────┘
Module
┌───────────────┬────┬─────────┬─────┬────────┬─────────┬─────┬───────────┬──────┐
│ Module │ id │ version │ pid │ status │ restart │ cpu │ memory │ user │
├───────────────┼────┼─────────┼─────┼────────┼─────────┼─────┼───────────┼──────┤
│ pm2-logrotate │ 2 │ 2.7.0 │ 205 │ online │ 0 │ 0% │ 44.5 MB │ root │
└───────────────┴────┴─────────┴─────┴────────┴─────────┴─────┴───────────┴──────┘
解决方案
一个原因是pm2 logrotate
不是 Docker 容器的主进程,而是 pm2 的托管进程,因此您可以通过停止定义的主进程来验证此行为,pm2.${NODE_ENV}.config.js
无论容器是否pm2-logrotate
正在运行,您的容器都会死掉。
另外,我认为它不应该为空,它应该类似于
pm2 ls
┌─────┬──────────────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
│ id │ name │ namespace │ version │ mode │ pid │ uptime │ ↺ │ status │ cpu │ mem │ user │ watching │
├─────┼──────────────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤
│ 1 │ www │ default │ 0.0.0 │ fork │ 26 │ 13s │ 0 │ online │ 0% │ 40.3mb │ root │ disabled │
└─────┴──────────────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘
Module
┌────┬───────────────────────────────────────┬────────────────────┬───────┬──────────┬──────┬──────────┬──────────┬──────────┐
│ id │ module │ version │ pid │ status │ ↺ │ cpu │ mem │ user │
├────┼───────────────────────────────────────┼────────────────────┼───────┼──────────┼──────┼──────────┼──────────┼──────────┤
│ 0 │ pm2-logrotate │ 2.7.0 │ 17 │ online │ 0 │ 0.5% │ 43.1mb │ root │
└────┴───────────────────────────────────────┴────────────────────┴───────┴──────────┴──────┴──────────┴──────────┴──────────┘
也建议使用 alpine 基础镜像,因为上图看起来很重,下图是 150MB,而上图是 1GB 左右。
FROM node:alpine
RUN npm install pm2 -g
RUN npm install
RUN pm2 install pm2-logrotate
RUN pm2 set pm2-logrotate:retain 90
RUN pm2 set pm2-logrotate:dateFormat YYYY-MM-DD_HH-mm-ss
RUN pm2 set pm2-logrotate:max_size 10M
RUN pm2 set pm2-logrotate:rotateInterval 0 0 * * *
RUN pm2 set pm2-logrotate:rotateModule true
RUN pm2 set pm2-logrotate:workerInterval 10
ENV NODE_ENV=$buildenv
ENV NPM_CONFIG_LOGLEVEL warn
WORKDIR /app
COPY . /app
CMD ["sh", "-c", "pm2-runtime start confi"]
推荐阅读
- php - 如何声明一个日期变量并将 datetimepicker 中的值插入到我的数据库中?
- mysql - 用于删除列上部分 URL 的 SQL 语句
- android - Android App Bundle (.aab) 在设备上崩溃
- git - 在 ubuntu 18.04.2LTS 中安装 git 时出现错误
- android - 如何在单击按钮上从 RecyclerView 中的 TextView 和 Radio 按钮获取值?
- r - 如何将数据框转换为列表列表?
- css - 如何动态更新角度动画?(角度 8)
- list - 如何停止计算列表中的 nil 值
- html - 格式化 CSS 表格和表单
- shopify - change.js 不更改购物车页面 shopify 上的价格