Sign inSign up

xooooooooox/logrotate

By xooooooooox

•Updated 10 months ago

Image
0

4.2K

xooooooooox/logrotate repository overview

⁠Logrotate 基础镜像

基于 Alpine 的轻量镜像,内置 logrotate 与 crond。适合以独立容器(sidecar)方式为其它产生日志文件的服务进行日志轮转与压缩。

镜像要点:

  • 基于 alpine,仅安装 logrotate 与 tzdata
  • 通过环境变量 CRON_SCHEDULE 配置执行频率(默认:0 0 * * * 每天零点)
  • 入口脚本会将计划任务写入 /etc/crontabs/root 并以前台方式运行 crond
  • 执行命令:/usr/sbin/logrotate -v /etc/logrotate.conf
  • 预置三个卷:/logs、/var/lib/logrotate、/etc/logrotate.d
    • /logs:约定存放需要轮转的日志目录(可选)
    • /var/lib/logrotate:logrotate 状态目录(持久化很重要)
    • /etc/logrotate.d:放置自定义轮转规则文件

提示:Alpine 的默认 /etc/logrotate.conf 会包含 /etc/logrotate.d,因此将规则文件放入该目录即可被发现。

⁠构建参数(Build Args)

参数默认值说明
BASE_IMAGE_VERSION3.21.3Alpine 基础镜像标签
TZAsia/Shanghai构建时设置系统时区并写入 /etc/localtime 与 /etc/timezone

构建示例:

docker build \
  --build-arg BASE_IMAGE_VERSION=3.21.3 \
  --build-arg TZ=Asia/Shanghai \
  -t base-logrotate:latest base-images/logrotate

⁠运行时配置(Environment)

  • TZ:运行时也可通过环境变量覆盖时区(许多程序会优先读取 TZ 变量)。
  • CRON_SCHEDULE:cron 表达式,控制 logrotate 执行频率,默认 0 0 * * *。

调试期间可将其设置为每 5 分钟:CRON_SCHEDULE="*/5 * * * *"。

⁠快速开始(Docker Run)

docker volume create logrotate_state

docker run -d --name logrotate \
  -e TZ=Asia/Shanghai \
  -e CRON_SCHEDULE="0 * * * *" \
  -v $(pwd)/logrotate.d:/etc/logrotate.d:ro \
  -v $(pwd)/logs:/logs \
  -v logrotate_state:/var/lib/logrotate \
  base-logrotate:latest

# 查看 crond 前台日志(包含 logrotate -v 输出)
docker logs -f logrotate

⁠Docker Compose 示例

services:
  logrotate:
    image: base-logrotate:latest
    restart: unless-stopped
    environment:
      TZ: Asia/Shanghai
      CRON_SCHEDULE: "*/15 * * * *"
    volumes:
      - ./logrotate.d:/etc/logrotate.d:ro
      - ./logs:/logs
      - logrotate_state:/var/lib/logrotate

volumes:
  logrotate_state: {}

⁠规则示例(/etc/logrotate.d/*.conf)

假设你的应用将日志写到 /logs/myapp/*.log,可以创建文件:logrotate.d/myapp:

/logs/myapp/*.log {
  daily           # 每日轮转
  rotate 7        # 保留 7 份
  missingok       # 文件不存在时不报错
  notifempty      # 空文件不轮转
  compress        # 压缩归档
  delaycompress   # 下一次再压缩,避免刚轮转就压缩影响读取
  dateext         # 使用日期扩展
  dateformat -%Y%m%d
  copytruncate    # 不向进程发送信号,直接复制再截断(适用于不会重新打开文件句柄的程序)
}

如果你的程序在收到 SIGHUP 后会重新打开日志文件,建议改用 create 与 postrotate/endscript 方式:

/logs/myapp/app.log {
  size 50M
  rotate 5
  missingok
  notifempty
  compress
  dateext
  create 0644 root root
  postrotate
    # 通过进程管理器向应用发送 HUP(示例)
    pkill -HUP -f "myapp-binary" || true
  endscript
}

copytruncate 与发送 HUP 信号是两种常见策略:

  • copytruncate 简单但在高并发写入时可能丢失极少量日志字节;
  • 发送 HUP 更稳妥,但要求应用支持重新打开日志文件。

⁠手动执行与排错

  • 立即执行(调试用):
docker exec -it logrotate sh -lc 'logrotate -dv /etc/logrotate.conf'
  • 查看状态文件:
docker exec -it logrotate sh -lc 'cat /var/lib/logrotate/status || true'
  • 检查 crond 与 logrotate 输出:
docker logs -f logrotate

如果你的规则没有生效,请确认:

  1. 规则文件是否位于 /etc/logrotate.d 且扩展名正确;
  2. 路径是否与实际日志路径匹配(容器内路径!);
  3. 状态目录 /var/lib/logrotate 是否持久化(避免容器重启后丢失上次轮转时间);
  4. 文件权限是否允许容器内用户(默认为 root)读取/重命名日志。

⁠与其他容器协作(Sidecar 模式)

  • 将产生日志的容器的日志目录以 bind mount 的方式挂载到本容器(例如都挂载到宿主的同一目录,再分别映射到两个容器)。
  • 或在 Docker 中使用 --volumes-from <container> 共享卷(需注意权限)。
  • 在 Kubernetes 中可通过共享 emptyDir/hostPath 卷实现同样效果(本镜像可直接用作 sidecar)。

⁠时区说明

  • 构建时会根据 TZ 写入 /etc/localtime 与 /etc/timezone;
  • 运行时设置 TZ 环境变量即可让大多数程序按该时区显示时间;
  • 如需完全统一,建议构建时与运行时保持相同的 TZ 设置。

⁠许可证

镜像遵循 Apache-2.0 许可证

Tag summary

Content type

Image

Digest

sha256:17c72983f…

Size

4 MB

Last updated

10 months ago

docker pull xooooooooox/logrotate:v1.24.8.20251222165615-linux-arm64