尽管有“max-size”命令,但docker-compose未旋转失控的docker日志

ou6hu8tu  于 2023-04-20  发布在  Docker
关注(0)|答案(1)|浏览(97)

bounty还有3天到期。回答此问题可获得+250声望奖励。D-Nice希望引起更多关注此问题。

我有一个Rails项目,我在生产环境中使用docker-compose运行。有很多日志,它们在几天内就填满了我的docker容器的所有空间。运行du --block-size=1M -a /var/lib/docker/,它显示了这些大的,不断增长的日志文件:
10543 /var/lib/docker/overlay2/cd749947f8cda9fa2b2cd14c0f1a2af88da66c43b2d4424e13c787d27dd0e41c/merged/dockerapp/log/production.log 10543 /var/lib/docker/overlay2/cd749947f8cda9fa2b2cd14c0f1a2af88da66c43b2d4424e13c787d27dd0e41c/diff/dockerapp/log/production.log
按照docker-compose v3文件的说明,我尝试使用以下命令限制文件大小和旋转:
logging: driver: "local" options: max-size: "15m" max-file: "3"
但是即使在docker-compose文件中(我也试过json驱动程序),日志继续增长,直到它们占用了我的docker容器的所有可用空间。我该如何解决这个问题?

xuo3flqw

xuo3flqw1#

Docker日志选项会影响容器的标准输出和错误流,这些输出和错误流存储在容器附近的文件中,但不在其文件系统中。您可以使用docker logs CONTAINER命令查看此日志。
您的production.log看起来像一个普通文件,因此它不会自动旋转,除非您将其实现为应用程序/容器的一部分。
最好是将日志指向容器内主进程的输出或错误流假设不使用host的PID命名空间,可以尝试登录其中一个:

/proc/1/fd/1  # stdout of the first proc
/proc/1/fd/2  # stderr of the first proc

无论PID名称空间如何,这些都可以安全地尝试:

# might not work with forking apps
/dev/stdout   # stdout of the current proc
/dev/stderr   # stderr of the current proc

如果您能够使用docker logs命令查看日志,您将知道它是否有效。
此外,有些流(例如nginx)更喜欢创建符号链接,而不是直接使用其中一个流。如果容器中有启动脚本,可以尝试添加以下内容:

ln -sf /dev/stdout /full/path/to/production.log

相关问题