Я использую, docker logs [container-name]
чтобы увидеть журналы конкретного контейнера.
Есть ли элегантный способ очистить эти журналы?
docker
docker-compose
boot2docker
docker-machine
Юсуф Майга
источник
источник
sudo sh -c "du -ch /var/lib/docker/containers/*/*-json.log"
Ответы:
Из этого вопроса есть одна строка, которую вы можете запустить:
или есть аналогичная команда усечения:
Я не большой поклонник ни одного из них, так как они изменяют файлы Docker напрямую. Удаление внешнего журнала может произойти, когда Docker записывает данные в формате json в файл, что приводит к появлению частичной строки и нарушению возможности чтения любых журналов из
docker logs
cli.Вместо этого вы можете сделать так, чтобы Docker автоматически поворачивал журналы для вас. Это делается с помощью дополнительных флагов для dockerd, если вы используете драйвер ведения журнала JSON по умолчанию :
Вы также можете установить это как часть вашего файла daemon.json вместо изменения ваших скриптов запуска:
Эти параметры должны быть настроены с правами root. Обязательно запустите
systemctl reload docker
после изменения этого файла, чтобы применить настройки. Этот параметр будет по умолчанию для всех вновь создаваемых контейнеров. Обратите внимание, что существующие контейнеры необходимо удалить и создать заново, чтобы получить новые ограничения журнала.Аналогичные параметры журнала могут быть переданы отдельным контейнерам, чтобы переопределить эти значения по умолчанию, что позволяет вам сохранять больше или меньше журналов для отдельных контейнеров. Из
docker run
этого выглядит:или в файле композиции:
Для дополнительной экономии места вы можете переключиться с драйвера журнала json на «локальный» драйвер журнала. Он принимает те же параметры max-size и max-file, но вместо сохранения в json использует двоичный синтаксис, который быстрее и меньше. Это позволяет хранить больше журналов в одном файле размера. Запись daemon.json для этого выглядит так:
Недостатком локального драйвера являются внешние парсеры / пересылки журналов, которые зависят от прямого доступа к журналам json, больше не будут работать. Поэтому, если вы используете такой инструмент, как filebeat для отправки в Elastic, или универсальный перенаправитель Splunk, я бы избегал «локального» драйвера.
У меня есть немного больше об этом в моей презентации Tips and Tricks .
источник
service docker restart
который сам по себе не работал. Также пришлось брендировать создание новых контейнеров, прежде чем оно вступило в силу. то есть, просто подняв старые контейнеры, вы не применили новую регистрациюecho -n > ...
. В любом случае, я бы хотел иметь больше контроля над моими журналами. Например, после перезапуска docker-compose мне бы хотелось иметь механизм, позволяющий что-то делать с сохраненными журналами.Использование:
Вам может понадобиться sudo
ссылка Джефф С. Как правильно очистить логи для контейнера Docker?
Справка: усечение файла во время его использования (Linux)
источник
containers
иначе содержимое недоступно.sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"
- работал для меняerror from daemon in stream: Error grabbing logs: invalid character '\x00' looking for beginning of value
В Docker для Windows и Mac, а также, возможно, и других, можно использовать опцию tail. Например:
Таким образом, отображаются только последние 100 строк, и вам не нужно сначала просматривать 1M строк ...
(И, следовательно, удаление журнала, вероятно, не требуется)
источник
источник
sudo sh -c "du -ch /var/lib/docker/containers/*/*-json.log"
, чтобы получить только общий размер журналовsudo sh -c "du -ch /var/lib/docker/containers/*/*-json.log | grep total"
Вы можете настроить logrotate для периодической очистки журналов.
Файл примера в /etc/logrotate.d/docker-logs
источник
docker run
? файл/etc/logrotate.d/docker-logs
не существует, я должен его создать?"log-opts"
как показано BMitch)Docker4Mac, решение 2018 года:
Первая строка получает путь к файлу журнала, аналогично принятому ответу.
Вторая строка использует это,
nsenter
что позволяет вам запускать команды вxhyve
виртуальной машине, которые являются серверами в качестве хоста для всех док-контейнеров под Docker4Mac. Команда, которую мы запускаем, знакомаtruncate -s0 $LOGPATH
из ответов, не относящихся к Mac.Если вы используете
docker-compose
, первая строка становится:и
<service>
имя службы из вашегоdocker-compose.yml
файла.Спасибо https://github.com/justincormack/nsenter1 за
nsenter
хитрость.источник
docker run -it --rm --privileged --pid=host alpine:latest nsenter -t 1 -m -u -n -i -- sh -c 'truncate -s0 /var/lib/docker/containers/*/*-json.log'
Вы не можете сделать это напрямую через команду Docker.
Вы можете либо ограничить размер журнала, либо использовать скрипт для удаления журналов, связанных с контейнером. Вы можете найти примеры сценариев здесь (читайте снизу): Функция: Возможность очистить историю журнала # 1083
Ознакомьтесь с разделом ведения журнала в справочнике файлов docker-compose, где вы можете указать параметры (например, ротацию журналов и ограничение размера журналов) для некоторых драйверов ведения журналов.
источник
Как пользователь root , попробуйте выполнить следующее:
или
или
источник
На моих серверах Ubuntu даже как sudo я получу
Cannot open ‘/var/lib/docker/containers/*/*-json.log’ for writing: No such file or directory
Но расчесывание докера проверяет и усекает ответы:
источник
Я предпочитаю это (из решений выше):
Однако я использую несколько систем (например, Ubuntu 18.x Bionic), где этот путь не работает должным образом. Docker устанавливается через Snap, поэтому путь к контейнерам больше похож на:
источник
Вы также можете указать параметры log-opts в
docker run
командной строке, например:или в docker-compose.yml, как это
Кредиты: https://medium.com/@Quigley_Ja/rotating-docker-logs-keeping-your-overlay-folder-small-40cfa2155412 (Джеймс Куигли)
источник
"5"
и"10m"
соответственно), как показано здесь для глобального файла daemon.json, но то же самое для docker-compose.yml. В обоих случаях это повлияет только на вновь созданные контейнеры."5"
это работает.10m
Работа , не цитируя действительно.Docker для пользователей Mac, вот решение:
Найти путь к файлу журнала по:
$ docker inspect | grep log
SSH в докер (предположим, что имя
default
, если нет, запустите,docker-machine ls
чтобы узнать):$ docker-machine ssh default
Изменить пользователя root ( ссылка ):
$ sudo -i
Удалить содержимое файла журнала:
$ echo "" > log_file_path_from_step1
источник
docker exec -it default sh
для ввода оболочки sh в контейнер. Однако многие контейнеры неявно делаютsudo
команду доступной.