Docker-Compose配置max-size后日志未轮转,空间被占满如何解决?
解决Rails容器内production.log持续占满空间的问题
问题根源
你配置的Docker日志驱动(local/json)仅负责管理**容器的标准输出(stdout)/标准错误(stderr)**日志,而你看到的/dockerapp/log/production.log是Rails应用直接写入容器内部文件系统的日志文件,不在Docker日志驱动的管控范围内,所以之前的轮转配置完全不起作用。
解决方案
方案1:让Rails日志输出到stdout/stderr(推荐)
将Rails的日志重定向到容器的标准输出,这样Docker的日志驱动就能接管日志,实现你配置的轮转规则。
- Rails 5及以上版本:启动容器时添加环境变量
RAILS_LOG_TO_STDOUT=true,在docker-compose.yml中配置:services: your_rails_service: environment: - RAILS_LOG_TO_STDOUT=true logging: driver: "local" options: max-size: "15m" max-file: "3" - 手动修改配置文件:在
config/environments/production.rb中添加或修改:
修改后重启容器,此时config.logger = ActiveSupport::Logger.new(STDOUT) config.logger.formatter = config.log_formatterdocker logs能看到Rails日志,且Docker会自动按配置轮转日志,容器内不会再生成大体积的production.log文件。
方案2:在容器内配置logrotate管理文件日志
如果必须保留容器内的日志文件,可在容器中部署logrotate实现轮转:
- 在构建Docker镜像时安装logrotate(以Debian/Ubuntu为例):
RUN apt-get update && apt-get install -y logrotate cron - 创建logrotate配置文件
/etc/logrotate.d/rails:/dockerapp/log/production.log { daily size 15M rotate 3 compress missingok notifempty copytruncate }copytruncate:截断日志文件后保留文件句柄,避免Rails因文件句柄失效停止写入日志
- 启动cron服务来定期执行logrotate,可在entrypoint脚本中添加:
cron && exec "$@"
方案3:挂载日志目录到宿主机
将容器内的日志目录挂载到宿主机,由宿主机的logrotate管理:
- 在docker-compose.yml中添加卷挂载:
services: your_rails_service: volumes: - ./host_rails_logs:/dockerapp/log - 在宿主机上创建logrotate配置(比如
/etc/logrotate.d/rails_host),规则同方案2,这样日志会存储在宿主机,不会占用容器空间,也便于备份和清理。
临时清理现有大日志文件
如果当前容器空间已经被占满,可先执行以下命令临时清理:
# 进入容器 docker-compose exec your_rails_service bash # 清空日志文件(安全方式,不中断日志写入) truncate -s 0 /dockerapp/log/production.log
内容的提问来源于stack exchange,提问作者D-Nice
相关产品推荐
相关产品推荐

