我使用docker logs [container-name]来查看特定容器的日志。
有什么优雅的方法来清除这些日志吗?
我使用docker logs [container-name]来查看特定容器的日志。
有什么优雅的方法来清除这些日志吗?
当前回答
我需要一些可以作为一个命令运行的东西,而不是必须编写docker ps并复制每个容器ID并多次运行该命令。我改编了BMitch的答案,我想分享一下,以防其他人发现这有用。
混合xargs似乎实现了我在这里需要的:
docker ps --format='{{.ID}}' | \
xargs -I {} sh -c 'echo > $(docker inspect --format="{{.LogPath}}" {})'
这将获取docker ps列出的每个容器ID(将删除列表中任何容器的日志!),将其输送到xargs中,然后回显一个空白字符串来替换容器的日志路径。
其他回答
如果你需要在删除之前存储日志文件的备份,我已经为指定的容器创建了一个执行以下操作的脚本(你必须使用sudo运行它):
创建一个文件夹以存储作为备份的压缩日志文件。 查找正在运行的容器的id(由容器名指定)。 使用随机名称将容器的日志文件复制到一个新位置(步骤1中的文件夹)。 压缩之前的日志文件(以节省空间)。 按您可以定义的特定大小截断容器的日志文件。
注:
It uses the shuf command. Make sure your linux distribution has it or change it to another bash-supported random generator. Before use, change the variable CONTAINER_NAME to match your running container; it can be a partial name (doesn't have to be the exact matching name). By default it truncates the log file to 10M (10 megabytes), but you can change this size by modifying the variable SIZE_TO_TRUNCATE. It creates a folder in the path: /opt/your-container-name/logs, if you want to store the compressed logs somewhere else, just change the variable LOG_FOLDER. Run some tests before running it in production.
#!/bin/bash
set -ex
############################# Main Variables Definition:
CONTAINER_NAME="your-container-name"
SIZE_TO_TRUNCATE="10M"
############################# Other Variables Definition:
CURRENT_DATE=$(date "+%d-%b-%Y-%H-%M-%S")
RANDOM_VALUE=$(shuf -i 1-1000000 -n 1)
LOG_FOLDER="/opt/${CONTAINER_NAME}/logs"
CN=$(docker ps --no-trunc -f name=${CONTAINER_NAME} | awk '{print $1}' | tail -n +2)
LOG_DOCKER_FILE="$(docker inspect --format='{{.LogPath}}' ${CN})"
LOG_FILE_NAME="${CURRENT_DATE}-${RANDOM_VALUE}"
############################# Procedure:
mkdir -p "${LOG_FOLDER}"
cp ${LOG_DOCKER_FILE} "${LOG_FOLDER}/${LOG_FILE_NAME}.log"
cd ${LOG_FOLDER}
tar -cvzf "${LOG_FILE_NAME}.tar.gz" "${LOG_FILE_NAME}.log"
rm -rf "${LOG_FILE_NAME}.log"
truncate -s ${SIZE_TO_TRUNCATE} ${LOG_DOCKER_FILE}
您可以创建一个cronjob来每月运行前面的脚本。第一次运行:
sudo crontab -e
在键盘上输入a进入编辑模式。然后添加如下一行:
0 0 1 * * /your-script-path/script.sh
按下退出键退出编辑模式。通过输入:wq并按enter键保存文件。确保script.sh文件具有执行权限。
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)
在我的Ubuntu服务器上,即使是sudo,我也会得到无法打开' /var/lib/docker/containers/*/*-json.log '来写:没有这样的文件或目录
但是结合docker检查和截断答案是有效的:
sudo truncate -s 0 `docker inspect --format='{{.LogPath}}' <container>`
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个字符,因为*意味着“任何东西”。
通过设置日志清除功能,可以定期清除日志。
“/etc/logrotate.d/docker-logs”文件示例
/var/lib/docker/containers/*/*.log {
rotate 7
daily
compress
size=50M
missingok
delaycompress
copytruncate
}