在docker-compose.yml中配置日志轮转,核心是为服务显式声明driver:"json-file"并设置max-size:"50m"和max-file:"3",修改后需docker-compose down再up -d重建容器才生效,旧日志须手动清理。

在 docker-compose.yml 中配置日志轮转,核心是给服务显式声明 json-file 日志驱动,并设置 max-size 和 max-file 两个关键参数。改完必须重建容器才能生效,不是热更新。
明确指定 json-file 驱动和轮转参数
不要依赖默认行为或留空 driver 字段,部分旧版 Compose 在未显式配置时可能不启用限制。每个需保护的服务下都应包含完整 logging 块:
-
driver: "json-file"—— 必须写全引号,不能写成local或省略 -
max-size: "50m"—— 单个日志文件上限,建议调试期用"10m",稳定后调至"50m"~"100m" -
max-file: "3"—— 最多保留 3 个滚动文件(当前 + 2 个历史),够排查又不堆积
示例配置:
services:
api:
image: myapp:latest
logging:
driver: "json-file"
options:
max-size: "50m"
max-file: "3"
配置生效必须重建容器
Docker Compose 不会动态重载日志配置。仅执行 docker-compose up -d 不会应用新日志设置,必须强制重建:
- 先停并删旧容器:
docker-compose down - 再启动新容器:
docker-compose up -d - 验证是否生效:
docker inspect <container_name> | grep -A 5 LogConfig</container_name>,确认输出中含"max-size":"50m"
清理已膨胀的旧日志文件
新配置只管后续日志,不会清理已有巨型日志。这些文件仍躺在 /var/lib/docker/containers/ 下,需手动处理:
- 查最大日志:
sudo du -sh /var/lib/docker/containers/*/*-json.log | sort -hr | head -5 - 清空运行中容器日志(不中断服务):
sudo truncate -s 0 /var/lib/docker/containers/<container_id>/<container_id>-json.log</container_id></container_id> - 切勿用
rm删除正在写入的日志文件,会导致 inode 占用不释放
进阶建议:全局设默认策略防漏配
若多个服务共用同一台宿主机,推荐在 /etc/docker/daemon.json 中统一配置,所有新容器自动继承(包括未在 compose 中显式写 logging 的):
{
"log-driver": "json-file",
"log-opts": {
"max-size": "50m",
"max-file": "3",
"mode": "non-blocking"
}
}
保存后执行 sudo systemctl restart docker。注意:service 级配置优先级高于全局配置,可按需覆盖。











