应用往 /app/logs 写日志,突然报 write /app/logs/app.log: no space left on device。宿主机 df -h 显示根分区还有 40G 可用。乍看像缓存或者权限的锅,追下去往往不是。
docker system df -v | head -20
docker exec api df -h /app
docker inspect api --format '{{.GraphDriver.Data.MergedDir}}'
追下去是这么回事:容器可写层在 overlay 上,受 Docker 数据目录所在分区的配额限制,和宿主机看到的剩余空间不是一回事。日志没做轮转时几十 G 很快被写满。
「容器 overlay 写满」相关的验证我通常做两遍,改完一次、隔天再看一次,确认不是临时生效。一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。
先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。别只看报错的最后一行,往上看几行,真正的起因通常在上面。
同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。
具体做法是,先看 docker system df 里容器的可写层占了多少;进容器 df -h 确认挂载点和宿主机分区对应关系;把日志目录挂成卷 别写在可写层里;给日志加轮转 把单文件大小压下来。
验收就看一点,可写层占用回落,写入恢复正常,日志文件按大小滚动。
