首先是错误的答案。从this question 可以运行一个单行:
echo "" > $(docker inspect --format='{{.LogPath}}' <container_name_or_id>)
而不是回声,有更简单的:
: > $(docker inspect --format='{{.LogPath}}' <container_name_or_id>)
或者有截断命令:
truncate -s 0 $(docker inspect --format='{{.LogPath}}' <container_name_or_id>)
我不是其中任何一个的忠实粉丝,因为它们直接修改 Docker 的文件。当 docker 将 json 格式的数据写入文件时,可能会发生外部日志删除,从而导致部分行,并破坏从docker logs cli 读取任何日志的能力。有关发生这种情况的示例,请参阅this comment on duketwo's answer:
清空日志文件后,我收到此错误:error from daemon in stream: Error grabbing logs: invalid character '\x00' looking for beginning of value
相反,您可以让 Docker 自动为您轮换日志。如果您使用默认的JSON logging driver,则可以通过向 dockerd 附加标志来完成此操作:
dockerd ... --log-opt max-size=10m --log-opt max-file=3
您也可以将其设置为您的daemon.json 文件的一部分,而不是修改您的启动脚本:
{
"log-driver": "json-file",
"log-opts": {"max-size": "10m", "max-file": "3"}
}
这些选项需要配置为具有 root 访问权限。确保在更改此文件以应用设置后运行systemctl reload docker。然后,此设置将成为任何新创建容器的默认设置。请注意,需要删除并重新创建现有容器才能接收新的日志限制。
可以将类似的日志选项传递给各个容器以覆盖这些默认值,从而允许您在各个容器上保存更多或更少的日志。从docker run 看起来像:
docker run --log-driver json-file --log-opt max-size=10m --log-opt max-file=3 ...
或在撰写文件中:
version: '3.7'
services:
app:
image: ...
logging:
options:
max-size: "10m"
max-file: "3"
为了节省更多空间,您可以从 json 日志驱动程序切换到“本地”日志驱动程序。它采用相同的 max-size 和 max-file 选项,但不是存储在 json 中,而是使用更快更小的二进制语法。这允许您在相同大小的文件中存储更多日志。 daemon.json 条目如下所示:
{
"log-driver": "local",
"log-opts": {"max-size": "10m", "max-file": "3"}
}
本地驱动程序的缺点是依赖于直接访问 json 日志的外部日志解析器/转发器将不再工作。因此,如果您使用诸如 filebeat 之类的工具发送到 Elastic 或 Splunk 的通用转发器,我会避免使用“本地”驱动程序。
我的Tips and Tricks presentation 对此有更多的了解。