Журналы контейнеров заполнили диск
По умолчанию журналы контейнеров растут без ограничения и не ротируются. Один говорливый контейнер заполняет раздел за дни, после чего перестают работать все службы на машине, а не только он.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Ограничение размера журналов не задано
Способ хранения журналов по умолчанию не ограничивает объём. Файлы растут, пока есть место.
-
Журналы не убираются после удаления контейнера
Остатки удалённых контейнеров занимают место. Очистка не выполняется сама.
-
Контейнер пишет в журнал слишком много
Отладочный вывод в контейнере даёт гигабайты за сутки. Ограничение размера прячет симптом, не убирая причину.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Сколько занимают образы, контейнеры и журналы.
sudo docker system dfКрупнейшие журналы контейнеров.
sudo du -sh /var/lib/docker/containers/*/*-json.log 2>/dev/null | sort -h | tailДействующий способ хранения журналов.
sudo docker info 2>/dev/null | grep -i "Logging Driver"Решение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Способ хранения журналов по умолчанию не ограничивает объём. Файлы растут, пока есть место.
- Как проверить
-
Посмотрите размер журналов и настройки.
sudo du -sh /var/lib/docker/containers/*/*-json.log 2>/dev/null | sort -h | tail -5 sudo docker info 2>/dev/null | grep -i "Logging Driver"
- Как исправить
-
Задайте предел размера и число файлов в настройках службы контейнеров. Настройка действует на новые контейнеры: существующие нужно пересоздать.
{ "log-driver": "json-file", "log-opts": { "max-size": "50m", "max-file": "3" } }
- Почему происходит
- Остатки удалённых контейнеров занимают место. Очистка не выполняется сама.
- Как проверить
-
Посмотрите занятое место по видам объектов.
sudo docker system df 2>/dev/null
- Как исправить
- Настройте периодическую очистку неиспользуемых объектов задачей по таймеру. Делать это вручную забывают.
- Почему происходит
- Отладочный вывод в контейнере даёт гигабайты за сутки. Ограничение размера прячет симптом, не убирая причину.
- Как проверить
-
Найдите самый говорливый контейнер.
sudo du -sh /var/lib/docker/containers/*/*-json.log 2>/dev/null | sort -h | tail -3
- Как исправить
- Снизьте подробность вывода в самом приложении. Ограничение размера при этом всё равно нужно как страховка.
Пример вывода
Журнал одного контейнера занял раздел. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
$ sudo du -sh /var/lib/docker/containers/*/*-json.log | sort -h | tail -2
1.2G /var/lib/docker/containers/8f2a.../8f2a...-json.log
34G /var/lib/docker/containers/c41b.../c41b...-json.log
dockerd[12300]: error writing log entry: write /var/lib/docker/containers/c41b/c41b-json.log: no space left on device
Связанные ошибки
- Docker: no space left on device при запуске контейнеров Раздел с /var/lib/docker заполнен образами и слоями. Как посчитать занятое и что можно удалить безопасно.
- No space left on device в журнале службы Нет места на устройстве: разбор по свободным блокам, по inode, по журналу systemd и по удалённым, но открытым файлам.
- Журнал занимает слишком много места Журнал разросся: где задаются пределы, как обрезать и почему обрезка иногда не помогает.
- Служба журналов останавливает приём: раздел заполнен Приём записей прекращён: не хватает места под журнал предзаписи или каталог не тот, что ожидался.
- Failed to connect to bus: подключение к шине недоступно Команды systemctl не работают: нет подключения к шине. Разбор для контейнеров, сеансов по ssh и служб пользователя.
- File corrupted or uncleanly shut down, renaming and replacing Журнал повреждён после жёсткой перезагрузки: что означает сообщение и когда нужно вмешательство.
- Function not implemented в контейнере Ошибка 38 при системном вызове: вызов запрещён фильтром или отсутствует в окружении. Разбор для контейнеров.
- I/O error, dev sda, sector N: ошибка носителя Ядро сообщает об ошибке чтения или записи на устройстве. Что делать со службой и данными.
Где встречается чаще всего
Источники
- Документация Docker: хранение журналов
-
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено контейнером с непрерывным выводом на малом разделе.