You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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_formatter
    
    修改后重启容器,此时docker logs能看到Rails日志,且Docker会自动按配置轮转日志,容器内不会再生成大体积的production.log文件。

方案2:在容器内配置logrotate管理文件日志

如果必须保留容器内的日志文件,可在容器中部署logrotate实现轮转:

  1. 在构建Docker镜像时安装logrotate(以Debian/Ubuntu为例):
    RUN apt-get update && apt-get install -y logrotate cron
    
  2. 创建logrotate配置文件/etc/logrotate.d/rails:
    /dockerapp/log/production.log {
      daily
      size 15M
      rotate 3
      compress
      missingok
      notifempty
      copytruncate
    }
    
    • copytruncate:截断日志文件后保留文件句柄,避免Rails因文件句柄失效停止写入日志
  3. 启动cron服务来定期执行logrotate,可在entrypoint脚本中添加:
    cron && exec "$@"
    

方案3:挂载日志目录到宿主机

将容器内的日志目录挂载到宿主机,由宿主机的logrotate管理:

  1. 在docker-compose.yml中添加卷挂载:
    services:
      your_rails_service:
        volumes:
          - ./host_rails_logs:/dockerapp/log
    
  2. 在宿主机上创建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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 09:07:32