Как правильно очистить логи для контейнера Docker?
Я использую docker logs [container-name]
чтобы увидеть логи конкретного контейнера.
Есть ли элегантный способ очистить эти журналы?
Ответы
Ответ 1
Из этого вопроса есть одна строка, которую вы можете запустить:
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
после изменения этого файла, чтобы применить настройки. Этот параметр будет по умолчанию для всех вновь создаваемых контейнеров. Существующие контейнеры необходимо удалить и создать заново, чтобы получить новые ограничения журнала. И аналогичные параметры журнала могут быть переданы в отдельные контейнеры, чтобы переопределить эти значения по умолчанию, что позволяет вам сохранить больше или меньше журналов в отдельных контейнерах.
Ответ 2
Использование:
truncate -s 0 /var/lib/docker/containers/*/*-json.log
Справка: усечение файла во время его использования (Linux)
Ответ 3
sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"
Ответ 4
Вы можете настроить logrotate для периодического удаления журналов.
Файл примера в файле /etc/logrotate.d/docker-logs
/var/lib/docker/containers/*/*.log {
rotate 7
daily
compress
size=50M
missingok
delaycompress
copytruncate
}
Ответ 5
В Docker для Windows и Mac, а также, возможно, и других, можно использовать опцию tail. Например:
docker logs -f --tail 100
Таким образом, отображаются только последние 100 строк, и вам не нужно сначала пролистывать 1М строк...
(И, следовательно, удаление журнала, вероятно, не требуется)
Ответ 6
Вы не можете сделать это напрямую через команду Docker.
Вы можете либо ограничить размер журнала, либо использовать скрипт для удаления журналов, связанных с контейнером. Вы можете найти примеры сценариев здесь (читайте снизу) : Возможность: Очистить историю журнала # 1083
Ознакомьтесь с разделом ведения журнала в справочнике по файлам docker-compose, где вы можете указать параметры (например, поворот журнала и ограничение размера журнала) для некоторых драйверов ведения журнала.
Ответ 7
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
.
Ответ 8
Как пользователь root, попробуйте выполнить следующее:
> /var/lib/docker/containers/*/*-json.log
или же
cat /dev/null > /var/lib/docker/containers/*/*-json.log
или же
echo "" > /var/lib/docker/containers/*/*-json.log
Ответ 9
На моих серверах 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>'
Ответ 10
Доккер для пользователей Mac, вот решение:
-
-
-
SSH в докер-машину (предположим, что имя default
, если нет, запустите docker-machine ls
, чтобы узнать):
$ docker-machine ssh default
-
Измените пользователя root (ссылка):
$ sudo -i
-
Удалить содержимое файла журнала:
$ echo "" > log_file_path_from_step1
Ответ 11
Я предпочитаю это (из решений выше):
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