Скрипт для поиска распухших логов докера
В который раз уже сталкиваюсь с этой ситуацией. Субботнее утро, хочется немного попрокрастинировать (что при загрузке 60-70 часов в неделю просто жизненно необходимо) и тут начинают сыпаться алерты - заканчивается место на диске одного из рабочих серверов. Как всегда запускаем в tmux команду sudo ncdu -x / и ждём. Пришлось ждать минут 40, так как количество файлов на хосте действительно велико, в основном за счёт кешей npm и node modules. И опять ожидаемо обнаружилось, что несколько сотен гигабайт съели логи новых докер контейнеров, запущенных разработчиками на хосте разработки.
Надоело ждать каждый раз окончания процесса поиска, поэтому написал простой скрипт, который сразу выводит список контейнеров, логи которых занимают более заданного количества гигабайт, их размер и расположение. В 90% случаев это позволяет быстро решить подобную прблему. Оставляю скрипт тут для копипасты на другие хосты при возникшей необходимости.
В случае, если не передано никаких параметров, будут найдены все логи более 3Гб размером, если передан параметр скажем, 5 - будут найдены логи более 5Гб размером.
#!/bin/sh
[ -n "$1" ] && size="$1" || size=3
ctlist=`docker ps -a 2>&1`
find /var/lib/docker/containers -name '*-json.log' -size +"$size"G | while read line; do
ctpref=`echo "$line" | sed 's#^.*/##;s/^\(.\{10\}\).*/\1/'`
ctname=`echo "$ctlist" | awk '$1~/'$ctpref'/ {print $NF}'`
size=`du -h "$line" | cut -d " " -f 1`
echo "$size\t$ctname"
done
Далее можно очистить лог следующим образом:
echo > /var/lib/docker/containers/64907b92fd3bf11e1f86b777a394c4275e994d0d3e29eb01657d95d5eb97b0bc/64907b92fd3bf11e1f86b777a394c4275e994d0d3e29eb01657d95d5eb97b0bc-json.log
Естественно, правильный вариант - указание параметров для docker-compose / swarm / kubernetes для ограничения размера лог файлов и их количества. Пример для docker-compose:
logging:
driver: "json-file"
options:
max-size: "200m"
max-file: "10"