null

Ротация логов Docker

Продолжаем серию заметок о сюрпризах, которые приносит нам 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  не будут отслеживать изменения до перезапуска контейнера, в котором была проведена ротация внешними (на уровне ФС ) или  собственными средствами.

Коротко о себе:

Работаю в компании TUNE-IT в качестве инженера и преподавателя.

В сферу профессиональных интересов входит все,  что связано с "большими" и не очень серверами и СХД от Sun Microsystems/Oracle и кластерами на их основе, но по долгу службы занимаюсь чаще всего их диагностикой и ремонтом... 

Делюсь опытом и  наработанными навыками в рамках курсов по  соответствующим направлениям.