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

时间:2017-02-28 13:25:28

标签: docker docker-compose boot2docker docker-machine

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

有清除这些日志的优雅方法吗?

19 个答案:

答案 0 :(得分:152)

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以应用设置。然后,此设置将成为任何新创建的容器的默认设置。需要删除并重新创建现有容器以接收新的日志限制。

答案 1 :(得分:144)

使用:

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

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

答案 2 :(得分:24)

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

答案 3 :(得分:21)

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

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

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

答案 4 :(得分:9)

您无法通过Docker命令直接执行此操作。

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

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

答案 5 :(得分: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中运行命令,该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技巧。

答案 6 :(得分:4)

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

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

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

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

答案 7 :(得分:3)

在Windows的Docker以及其他可能的Docker上,可以使用tail选项。

例如 码头工人日志-f --tail 100 msftmodbus

这样,仅显示最后100行,而您不必先滚动1M行……

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

答案 8 :(得分:3)

您还可以在docker run命令行上提供log-opts参数,如下所示:

docker run --log-opt max-size=10m --log-opt max-file=5 my-app:latest

或像这样的docker-compose.yml中

my-app:
image: my-app:latest
logging:
    driver: "json-file"
    options:
        max-file: "5"
        max-size: 10m

积分:https://medium.com/@Quigley_Ja/rotating-docker-logs-keeping-your-overlay-folder-small-40cfa2155412(詹姆斯·奎格利)

答案 9 :(得分:2)

Linux/Ubuntu:

如果您有多个容器,并且只想删除一个日志而不删除其他日志。

  • 如果您遇到“权限被拒绝”等问题,请先sudo su
  • 列出所有容器:docker ps -a
  • 寻找您想要的容器并复制 CONTAINER ID。示例:E1X2A3M4P5L6
  • Containers 文件夹和真实名称比 E1X2A3M4P5L6 长,但前 12 个字符是导致 docker ps -a 的字符。
  • 只删除那个日志: > /var/lib/docker/containers/E1X2A3M4P5L6*/E1X2A3M4P5L6*-json.log(将 E1X2A3M4P5L6 替换为您的结果!!)

如您所见,/containers 内部是容器,日志具有相同的名称,但末尾带有 -json.log。您只需要知道前 12 个字符,因为 * 表示“任何东西”。

答案 10 :(得分:2)

我确实喜欢这个(从上面的解决方案中得出):

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

但是,我正在运行多个系统(例如,Ubuntu 18.x Bionic),但该路径无法按预期工作。 Docker是通过Snap安装的,因此容器的路径更像是:

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

答案 11 :(得分:2)

sudo find /var/lib/docker/containers/ -type f -name "*.log" -delete

答案 12 :(得分:2)

要删除/清除 docker 容器日志,我们可以使用以下命令

<块引用>

$(docker inspect container_id|grep "LogPath"|cut -d """ -f4) 要么 $(docker inspect container_name|grep "LogPath"|cut -d """ -f4)

答案 13 :(得分:2)

以下是用于清除docker容器日志的跨平台解决方案:

docker run --rm -v /var/lib/docker:/var/lib/docker alpine sh -c "echo '' > $(docker inspect --format='{{.LogPath}}' CONTAINER_NAME)"

将其粘贴到您的终端中,然后将CONTAINER_NAME更改为所需的容器名称或ID。

答案 14 :(得分:1)

萨拉姆
感谢 answer by @BMitch,我刚刚编写了一个 shell 脚本来清理所有容器的日志:

#!/bin/bash
ids=$(docker ps -a --format='{{.ID}}')
for id in $ids
do
        echo $(docker ps -a --format='{{.ID}} ### {{.Names}} ### {{.Image}}' | fgrep $id)
        truncate -s 0 $(docker inspect --format='{{.LogPath}}' $id)
        ls -llh $(docker inspect --format='{{.LogPath}}' $id)
done

亚阿里。

答案 15 :(得分:1)

不确定这是否对您有帮助,但是卸下容器总是有帮助的。

因此,如果您使用docker-compose进行设置,则只需使用docker-compose down && docker-compose up而不是docker-compose restart。通过适当的设置(确保对永久数据使用卷挂载),您不会以这种方式丢失任何数据。

当然,这超出了OP的要求。但是在很多情况下,其他答案都无济于事(如果使用远程泊坞服务器或在Windows计算机上工作,则访问基础文件系统是专有且困难的)

答案 16 :(得分:0)

我需要可以作为一个命令运行的东西,而不必编写docker ps并复制每个Container ID并多次运行该命令。我改编了BMitch's answer,并认为我愿意与他人分享,以防别人发现它有用。

混合xargs似乎可以满足我的需要:

docker ps --format='{{.ID}}' | \
  xargs -I {} sh -c 'echo > $(docker inspect --format="{{.LogPath}}" {})'

这将抓取docker ps列出的每个容器ID(会删除该列表上任何容器的日志!),将其通过管道传送到xargs中,然后回显一个空白字符串替换容器的日志路径。

答案 17 :(得分: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>`

答案 18 :(得分:0)

适用于Mac用户的Docker,这是解决方案:

    1. 通过以下方式查找日志文件路径:

      $ docker inspect | grep log

    1. SSH进入docker机器(假设名称为default,如果没有,请运行docker-machine ls查找):

      $ docker-machine ssh default

    1. 更改为root用户(reference):

      $ sudo -i

    1. 删除日志文件内容:

      $ echo "" > log_file_path_from_step1