基于 Alpine 的轻量镜像,内置 logrotate 与 crond。适合以独立容器(sidecar)方式为其它产生日志文件的服务进行日志轮转与压缩。
镜像要点:
alpine,仅安装 logrotate 与 tzdataCRON_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,因此将规则文件放入该目录即可被发现。
| 参数 | 默认值 | 说明 |
|---|---|---|
BASE_IMAGE_VERSION | 3.21.3 | Alpine 基础镜像标签 |
TZ | Asia/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
TZ:运行时也可通过环境变量覆盖时区(许多程序会优先读取 TZ 变量)。CRON_SCHEDULE:cron 表达式,控制 logrotate 执行频率,默认 0 0 * * *。调试期间可将其设置为每 5 分钟:CRON_SCHEDULE="*/5 * * * *"。
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
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: {}
假设你的应用将日志写到 /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'
docker logs -f logrotate
如果你的规则没有生效,请确认:
/etc/logrotate.d 且扩展名正确;/var/lib/logrotate 是否持久化(避免容器重启后丢失上次轮转时间);--volumes-from <container> 共享卷(需注意权限)。emptyDir/hostPath 卷实现同样效果(本镜像可直接用作 sidecar)。TZ 写入 /etc/localtime 与 /etc/timezone;TZ 环境变量即可让大多数程序按该时区显示时间;TZ 设置。镜像遵循 Apache-2.0 许可证
Content type
Image
Digest
sha256:17c72983f…
Size
4 MB
Last updated
10 months ago
docker pull xooooooooox/logrotate:v1.24.8.20251222165615-linux-arm64