如何正确清除Docker容器的日志?

问题描述 投票:108回答:9

我使用docker logs [container-name]查看特定容器的日志。

是否有一种优雅的方式来清除这些日志?

docker docker-compose boot2docker docker-machine
9个回答
167
投票

来自this question,你可以运行一个单行程:

echo "" > $(docker inspect --format='{{.LogPath}}' <container_name_or_id>)

我不是直接修改Docker文件的忠实粉丝。您可以让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"}
}

确保在更改此文件后运行systemctl reload docker以应用设置。然后,此设置将成为任何新创建的容器的默认设置。需要删除并重新创建现有容器以接收新的日志限制。


0
投票

在我的Ubuntu服务器上甚至作为sudo我会得到Cannot open ‘/var/lib/docker/containers/*/*-json.log’ for writing: No such file or directory

但梳理docker检查并截断答案是有效的:

sudo truncate -s 0 `docker inspect --format='{{.LogPath}}' <container>`

157
投票

使用:

truncate -s 0 /var/lib/docker/containers/*/*-json.log

参考:Truncating a file while it's being used (Linux)


27
投票
sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"

23
投票

您可以设置logrotate以定期清除日志。

/etc/logrotate.d/docker-logs中的示例文件

/var/lib/docker/containers/*/*.log {
 rotate 7
 daily
 compress
 size=50M
 missingok
 delaycompress
 copytruncate
}

9
投票

您不能通过Docker命令直接执行此操作。

您可以限制日志的大小,也可以使用脚本删除与容器相关的日志。你可以在这里找到脚本示例(从下面阅读):Feature: Ability to clear log history #1083

查看docker-compose文件引用的logging section,您可以在其中为某些日志记录驱动程序指定选项(例如日志轮换和日志大小限制)。


8
投票

Docker4Mac,2018解决方案:

LOGPATH=$(docker inspect --format='{{.LogPath}}' <container_name_or_id>)
docker run -it --rm --privileged --pid=host alpine:latest nsenter -t 1 -m -u -n -i -- truncate -s0 $LOGPATH

第一行获取日志文件路径,类似于接受的答案。

第二行使用nsenter,它允许您在xhyve VM中运行命令,该命令用作Docker4Mac下所有docker容器的主机。我们运行的命令是来自非Mac答案的熟悉的truncate -s0 $LOGPATH

如果您使用docker-compose,第一行将成为:

local LOGPATH=$(docker inspect --format='{{.LogPath}}' $(docker-compose ps -q <service>))

<service>是您的docker-compose.yml文件中的服务名称。

感谢https://github.com/justincormack/nsenter1nsenter技巧。


7
投票

在Windows上的Docker上,也可能是其他人,可以使用tail选项..

例如docker logs -f --tail 100 msftmodbus

这样,只显示最后100行,并且您没有首先滚动1M行...

(因此,删除日志可能是不必要的)


5
投票

作为root用户,尝试运行以下命令:

>  /var/lib/docker/containers/*/*-json.log

要么

cat /dev/null > /var/lib/docker/containers/*/*-json.log

要么

echo "" > /var/lib/docker/containers/*/*-json.log

0
投票

Docker for Mac用户,这是解决方案:

  • 查找日志文件路径: $ docker inspect | grep log
  • SSH进入docker机器(假设名称为default,如果没有,请运行docker-machine ls查找): $ docker-machine ssh default
  • 更改为root用户(reference): $ sudo -i
  • 删除日志文件内容: $ echo "" > log_file_path_from_step1
© www.soinside.com 2019 - 2024. All rights reserved.