Я использую docker logs [container-name]
чтобы увидеть логи конкретного контейнера.
Есть ли элегантный способ очистить эти журналы?
Я использую docker logs [container-name]
чтобы увидеть логи конкретного контейнера.
Есть ли элегантный способ очистить эти журналы?
Из этого вопроса есть одна строка, которую вы можете запустить:
echo "" > $(docker inspect --format='{{.LogPath}}' <container_name_or_id>)
Я не большой поклонник изменения файлов Docker напрямую с помощью этой команды, команды усечения или ротации журнала, поскольку каждый из них является внешним по отношению к Docker. Удаление внешнего журнала может произойти, когда докер записывает данные в формате json в файл, что приводит к появлению частичной строки и нарушению возможности чтения любых журналов из docker logs
cli.
Вместо этого вы можете сделать так, чтобы Docker автоматически поворачивал журналы для вас. Это делается с помощью дополнительных флагов для dockerd, если вы используете драйвер ведения журнала JSON по умолчанию:
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
после изменения этого файла, чтобы применить настройки. Этот параметр будет по умолчанию для всех вновь создаваемых контейнеров. Существующие контейнеры необходимо удалить и создать заново, чтобы получить новые ограничения журнала. И аналогичные параметры журнала могут быть переданы в отдельные контейнеры, чтобы переопределить эти значения по умолчанию, что позволяет вам сохранить больше или меньше журналов в отдельных контейнерах.
Использование:
truncate -s 0 /var/lib/docker/containers/*/*-json.log
sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"
Вы можете настроить logrotate для периодического удаления журналов.
Файл примера в файле /etc/logrotate.d/docker-logs
/var/lib/docker/containers/*/*.log {
rotate 7
daily
compress
size=50M
missingok
delaycompress
copytruncate
}
В Docker для Windows и Mac, а также, возможно, и других, можно использовать опцию tail. Например:
docker logs -f --tail 100
Таким образом, отображаются только последние 100 строк, и вам не нужно сначала пролистывать 1М строк...
(И, следовательно, удаление журнала, вероятно, не требуется)
Вы не можете сделать это напрямую через команду Docker.
Вы можете либо ограничить размер журнала, либо использовать скрипт для удаления журналов, связанных с контейнером. Вы можете найти примеры сценариев здесь (читайте снизу) : Возможность: Очистить историю журнала # 1083
Ознакомьтесь с разделом ведения журнала в справочнике по файлам docker-compose, где вы можете указать параметры (например, поворот журнала и ограничение размера журнала) для некоторых драйверов ведения журнала.
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
которая является хостом для всех док-контейнеров под Docker4Mac. Команда, которую мы запускаем, является знакомым truncate -s0 $LOGPATH
из ответов, не относящихся к Mac.
Если вы используете docker-compose
, первая строка становится такой:
local LOGPATH=$(docker inspect --format='{{.LogPath}}' $(docker-compose ps -q <service>))
<service>
- это имя службы из вашего файла docker-compose.yml
.
Спасибо https://github.com/justincormack/nsenter1 за трюк с nsenter
.
Как пользователь root, попробуйте выполнить следующее:
> /var/lib/docker/containers/*/*-json.log
или же
cat /dev/null > /var/lib/docker/containers/*/*-json.log
или же
echo "" > /var/lib/docker/containers/*/*-json.log
На моих серверах Ubuntu, даже если у меня есть sudo, я не Cannot open '/var/lib/docker/containers/*/*-json.log for writing: No such file or directory
Но расчесывание докера проверяет и усекает ответы:
sudo truncate -s 0 'docker inspect --format='{{.LogPath}}' <container>'
Доккер для пользователей Mac, вот решение:
Найдите путь к файлу журнала:
$ docker inspect | grep log
SSH в докер-машину (предположим, что имя default
, если нет, запустите docker-machine ls
, чтобы узнать):
$ docker-machine ssh default
Измените пользователя root (ссылка):
$ sudo -i
Удалить содержимое файла журнала:
$ echo "" > log_file_path_from_step1
Я предпочитаю это (из решений выше):
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