我使用docker logs [container-name]
查看特定容器的日志。
有清除这些日志的优雅方法吗?
答案 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
答案 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/nsenter1的nsenter
技巧。
答案 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
。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,这是解决方案:
通过以下方式查找日志文件路径:
$ docker inspect | grep log
SSH进入docker机器(假设名称为default
,如果没有,请运行docker-machine ls
查找):
$ docker-machine ssh default
更改为root用户(reference):
$ sudo -i
删除日志文件内容:
$ echo "" > log_file_path_from_step1