Продолжаем серию заметок о сюрпризах, которые приносит нам Docker.
Как правило, сервисы, которые контейнеризируются, применяют собственные механизмы ротации логов (средствами приложения) или используют стандартные классические - например logrotate, и наличие оных вызывает некую расслабленность администраторов данных сервисов). Однако, по умолчанию в Docker ведется логирование всего, что происходит в контейнерах(стандартный вывод/ошибки) в виде отдельного лог-файла в формате json (драйвер json) и никакой ротации по умолчанию не предусмотрено.
Рано или поздно при активно-логирующихся сервисах размер лога вырастает до размеров не умещяющихся на дисках загрузчика, при этом штатно работающая встроенная ротация сервиса продолжает и дальше штатно работать)
Для того, чтобы не получить аварию в самый неподходящий момент, необходимо заранее настроить ротацию глобально или применительно к конкретным контейнерам.
Глобальная настройка :
/etc/docker/daemon.json
{
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
}
}
Необходимо незабыть перезапустить dockerd (например systemctl restart docker)
При запуске dockerd :
dockerd ... --log-opt max-size=100m --log-opt max-file=3
На уровне контейнера:
docker run --log-opt max-size=100m --log-opt max-file=3 <app_name>
На уровне сервиса :
services:
<service_name>:
logging:
driver: "json-file"
options:
max-size: "100m"
max-file: "3"
*После изменения конфига незабыть : docker compose down/ docker compose up -d
Проверка конфигурации :
docker container inspect <container_name> | grep LogConfig -A6
Если в данный момент нет возможности перезапустить контейнер/сервис/dockerd, можно выполнить усечение файла например так :
truncate -s 0 $(docker inspect --format='{{.LogPath}}' <container_name>)
или так
:> $(docker inspect --format='{{.LogPath}}' <container_name>)
(!) Помним, что на данный момент (есть открытый баг) попытка ротировать файлы логов приводит к невозможности работы docker в режиме отслеживания логов ( -f ) , т.е. docker logs -f / docker-compose logs -f не будут отслеживать изменения до перезапуска контейнера, в котором была проведена ротация внешними (на уровне ФС ) или собственными средствами.