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

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


当前回答

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

查找日志文件路径: $ docker inspect | grep日志 SSH进入docker机器(假设名称是默认的,如果不是,运行docker-machine ls来查找): $ docker-machine SSH默认 更改为root用户(参考): $ sudo -i 删除日志文件内容: $ echo "" > log_file_path_from_step1 .

其他回答

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虚拟机中运行命令,xhyve虚拟机作为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/nsenter1提供的nsenter技巧。

我需要一些可以作为一个命令运行的东西,而不是必须编写docker ps并复制每个容器ID并多次运行该命令。我改编了BMitch的答案,我想分享一下,以防其他人发现这有用。

混合xargs似乎实现了我在这里需要的:

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

这将获取docker ps列出的每个容器ID(将删除列表中任何容器的日志!),将其输送到xargs中,然后回显一个空白字符串来替换容器的日志路径。

Use:

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

你可能需要sudo

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

参考Jeff S. Docker:如何正确地清除Docker容器的日志?

参考:在文件被使用时截断它(Linux)

Linux / Ubuntu:

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

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

正如您所看到的,在/containers内部是容器,logs具有相同的名称,但在结尾使用-json.log。你只需要知道前12个字符,因为*意味着“任何东西”。

Docker系统修剪 在命令提示符下执行该命令