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

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


当前回答

下面是一个清除docker容器日志的跨平台解决方案:

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

将其粘贴到终端中,并将CONTAINER_NAME更改为所需的容器名称或id。

其他回答

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

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

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

通过设置日志清除功能,可以定期清除日志。

“/etc/logrotate.d/docker-logs”文件示例

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

在我的Ubuntu服务器上,即使是sudo,我也会得到无法打开' /var/lib/docker/containers/*/*-json.log '来写:没有这样的文件或目录

但是结合docker检查和截断答案是有效的:

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

如果你需要在删除之前存储日志文件的备份,我已经为指定的容器创建了一个执行以下操作的脚本(你必须使用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文件具有执行权限。