Как правильно очистить журналы для контейнера Docker?


Я использую docker logs [container-name] для просмотра журналов конкретного контейнера.

есть ли элегантный способ очистить эти журналы?

8 69

8 ответов:

С этот вопрос есть один лайнер, который вы можете запустить:

echo "" > $(docker inspect --format='{{.LogPath}}' <container_name_or_id>)

Я не большой поклонник изменения файлов Docker напрямую. Вы можете иметь Докер автоматически поворачивать журналы для вас. Это делается с дополнительными флагами в dockerd, если вы используете значение по умолчанию JSON logging driver:

dockerd ... --log-opt max-size=10m --log-opt max-file=3

вы также можете установить это как часть вашей демон.json файл вместо изменения вашего запуска скрипты:

{
  "log-driver": "json-file",
  "log-opts": {"max-size": "10m", "max-file": "3"}
}

обязательно запустите systemctl reload docker после изменения этого файла, чтобы применить настройки.

использование:

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

ссылки: усечение файла во время его использования (Linux)

вы можете настроить logrotate для периодической очистки журналов.

пример файла в /etc / logrotate.д/докер-журналы

/var/lib/docker/containers/*/*.log {
 rotate 7
 daily
 compress
 size=50M
 missingok
 delaycompress
 copytruncate
}
sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"

вы не можете сделать это непосредственно через команду Docker.

вы можете либо ограничить размер журнала, либо использовать скрипт для удаления журналов, связанных с контейнером. Вы можете найти примеры скриптов здесь (Читайте снизу):особенность: возможность очистить историю журнала #1083

Проверьте вкладка "протоколирование" ссылки на файл docker-compose, где вы можете указать параметры (например, поворот журнала и ограничение размера журнала) для некоторых журналов водители.

как root пользователь, попробуйте выполнить следующее:

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

или

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

или

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

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, что серверы в качестве хоста для всех контейнеров docker под Docker4Mac. Команда, которую мы запускаем, является знакомой truncate -s0 $LOGPATH из ответов, отличных от Mac.

если вы используете docker-compose первая строка будет:

local LOGPATH=$(docker inspect --format='{{.LogPath}}' $(docker-compose ps -q <service>))

и <service> - это имя службы из .

спасибо https://github.com/justincormack/nsenter1 для nsenter трюк.

Docker для пользователей Mac, вот решение:

    1. найти путь к файлу журнала:

      $ docker inspect | grep log

    1. SSH в машину docker( предположим, что имя default, если нет, запустите docker-machine ls узнать):

      $ docker-machine ssh default

    1. изменить на пользователя root (ссылка):

      $ sudo -i

    1. удалить содержимое файла журнала:

      $ echo "" > log_file_path_from_step1