Скрипт для поиска распухших логов докера

Зайчатки разума

Записная книжка айтишника

Скрипт для поиска распухших логов докера

2023-05-27 13:44:08 — Evgeniy Shumilov

  В который раз уже сталкиваюсь с этой ситуацией. Субботнее утро, хочется немного попрокрастинировать (что при загрузке 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"

Теги: docker, админское

comments powered by Disqus