Логи Docker-шлюза API заполнили диск: ротация json-file и проверка контейнера
Отделите вывод контейнера от файлов приложения и базы, проверьте max-size и max-file у json-file и выясните, почему старый контейнер не принимает настройки. Приведены порядок безопасного пересоздания и локальная проверка.
Если собственный шлюз API перестал записывать данные и сообщает no space left on device, причина не обязательно в сервисе модели. Сначала выясните, какой диск и какие данные растут. Настройка приложения «хранить логи 7 дней» может вообще не ограничивать вывод контейнера, который собирает Docker.
Статья относится к Docker Engine и Compose и рассматривает объём и ротацию логов контейнера. Она не заменяет обслуживание базы данных или резервное копирование и не переносится автоматически на управляемые платформы. Примеры проверены локально без Docker; реальная ротация и платные запросы API не выполнялись.
1. Разделите вывод контейнера, файлы приложения и данные бизнеса
Драйвер json-file собирает стандартный вывод и поток ошибок контейнера, добавляя время и источник к строкам; каждому контейнеру соответствует свой журнал.[1] Файлы, которые приложение пишет непосредственно в смонтированный каталог, и записи вызовов в базе не очищаются от настройки ротации этого драйвера.
| Что растёт | Где проверить | Что ограничивает рост |
|---|---|---|
| stdout/stderr контейнера | Драйвер конкретного контейнера и мониторинг роста логов | Драйвер Docker и объём вывода приложения |
| Собственные файлы приложения | Настройки логов и фактические монтирования | Приложение или отдельный механизм ротации |
| База аккаунтов, балансов и запросов | Расположение базы, рост таблиц и индексов | Правила хранения приложения и базы |
| Образы, кэш сборки и другие файлы | Объекты Docker и мониторинг диска хоста | Жизненный цикл соответствующих объектов |
Зафиксируйте свободное место, скорость роста, сервис с ошибкой и монтирования на один момент времени. В Linux проверьте также исчерпание inode; в Docker Desktop различайте место на хосте и хранилище виртуальной машины Linux. Название каталога не доказывает, что том базы является удаляемым кэшем.
При нехватке места сначала сократите необязательный отладочный вывод и новую нагрузку, сохранив обезличенное описание сбоя. Не экспортируйте весь журнал на тот же почти заполненный диск. Если запись бизнес-данных уже нарушилась, ограничьте вход по процедуре обслуживания и проверьте состояние расчётов: немного освободившегося места ещё не означает восстановление. Для защиты данных используйте план резервирования и восстановления шлюза.
2. Проверьте контейнер, а не только глобальное значение
По документации Docker, json-file по умолчанию не выполняет ротацию. Значение max-size по умолчанию равно -1, то есть размер не ограничен; max-file действует только вместе с настроенным max-size.[1][2] Однако в вашей среде драйвер по умолчанию могли изменить, поэтому прочитайте фактические настройки.
Следующие команды только читают данные. Убедитесь, что Docker CLI подключён к нужной среде, и замените пример gateway-container на проверенное имя или ID контейнера. Не отправляйте полный результат docker inspect в обращение: другие поля могут содержать переменные окружения и секреты.
docker info --format '{{.LoggingDriver}}'
docker inspect --type container --format '{{json .HostConfig.LogConfig}}' gateway-container
Первая строка показывает драйвер по умолчанию у демона, вторая — конфигурацию, принятую конкретным контейнером при создании.[2][4] Новое глобальное значение не доказывает обновление старого контейнера. Проверьте каждый экземпляр шлюза, обратный прокси и фоновые обработчики отдельно.
Если используется json-file без предела размера, проверьте накопление вывода без ротации. Для local, journald или удалённого драйвера нужны его собственные правила: выводы о json-file к нему не относятся. Docker рекомендует local с ротацией по умолчанию для подходящих сценариев, но перед сменой проверьте, не зависит ли ваш сборщик от формата файлов JSON.[2][3]
3. Задайте явную ротацию в существующем сервисе Compose
Это фрагмент для объединения с существующим файлом Compose, а не полный файл развёртывания. Замените gateway на настоящее имя сервиса. Сохраните образ, монтирования, сети и прочие настройки; не перезаписывайте ими весь файл.[5]
services:
gateway:
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
При достижении порога размера журнал ротируется. Сохраняется не более трёх файлов, а при превышении количества удаляется самый старый.[1] Числа иллюстрируют настройку и не являются универсальной рекомендацией для шлюзов. Выбирайте их по скорости вывода одного контейнера, числу экземпляров, окну диагностики и свободному месту. Ротация по размеру не гарантирует хранение фиксированного числа дней.
Частые повторяющиеся ошибки могут быстро вытеснить историю. Работающий контейнер не гарантирует наличие вчерашних записей. У каждого экземпляра свои лимиты; произведение порога на число файлов не является жёсткой дисковой квотой всей машины. Учтите базу, другие журналы, метаданные и временное место. Для платёжных и аудиторских доказательств нужен отдельный план хранения и доступа: сроки хранения логов и минимальные поля.
При глобальной настройке через daemon.json документация требует строковые значения log-opts. После перезапуска демона они применяются только к вновь создаваемым контейнерам.[1][2] Глобальная операция затрагивает и другие сервисы; её нельзя считать небольшим изменением лишь одного шлюза.
4. Пересоздайте нужные контейнеры и защитите данные
Конфигурация логирования определяется при создании контейнера. Изменение файла или перезапуск существующего контейнера не заставляет его автоматически принять новые параметры.[2] Команда Compose up при изменении конфигурации или образа пересоздаёт контейнеры сервиса, сохраняя смонтированные тома; --no-recreate запрещает пересоздание.[6]
До применения сохраните старую конфигурацию, подтвердите расположение базы и загруженных файлов в проверенном постоянном хранилище, подготовьте восстанавливаемую резервную копию, закрепите версию образа и назначьте окно перерыва. Дождитесь завершения активных запросов и расчётов, затем пересоздайте целевой сервис по принятой процедуре. Не совмещайте изменение логирования с обновлением шлюза или удалением томов. Данные в записываемом слое контейнера нельзя считать сохранёнными.
После пересоздания снова прочитайте HostConfig.LogConfig каждого нового контейнера, запишите ID и время создания. Драйвер, max-size и max-file должны соответствовать ожиданиям. Правильный файл при старых параметрах работающего экземпляра означает неприменённое изменение, а не необходимость ещё уменьшить число. См. также проверку изменений Compose, которые не вступили в силу.
Настройка ротации прежде всего ограничивает дальнейший рост, а не является универсальной командой возврата уже занятого места. Docker предупреждает: прямое вмешательство внешних утилит в файлы драйвера может нарушить логирование.[1][3] Не удаляйте и не обнуляйте их вручную; массовая очистка контейнеров, образов или томов также не должна быть стандартным исправлением. Решение об удалении старого контейнера и сохранении его журналов принимайте отдельно после проверки расположения бизнес-данных.
5. Отсекайте пропуски локальной проверкой
Пример Node.js проверяет только вручную скопированный объект конфигурации. Он не подключается к Docker, не читает секреты и ничего не пересоздаёт. Правило этой проверки требует двух явных лимитов. Другие форматы, допустимые Docker, проверяйте по документации: результат review-* не означает, что сам Docker обязательно отклонит настройку.
function reviewRotation(config) {
const isObject = value => value !== null &&
typeof value === 'object' && !Array.isArray(value)
if (!isObject(config) || typeof config.Type !== 'string' ||
!config.Type.trim()) return 'invalid-input'
if (config.Type !== 'json-file') return 'other-driver'
const options = config.Config
if (!isObject(options)) return 'review-options'
const size = options['max-size']
if (typeof size !== 'string' || !/^[1-9]\d*[kmg]$/i.test(size)) {
return 'review-size'
}
const sizeValue = Number(size.slice(0, -1))
if (!Number.isSafeInteger(sizeValue)) return 'review-size'
const count = options['max-file']
if (typeof count !== 'string' || !/^[1-9]\d*$/.test(count) ||
!Number.isSafeInteger(Number(count))) return 'review-count'
return 'rotation-configured'
}
console.log(reviewRotation({
Type: 'json-file',
Config: { 'max-size': '10m', 'max-file': '3' }
}))
Нормальный пример выводит rotation-configured: поля прошли только эту локальную проверку. Отсутствующий max-size, значение -1 или один лишь max-file дадут review-size. Отсутствующее явное число файлов даст review-count, хотя Docker имеет для max-file значение по умолчанию 1.[1] Другой драйвер даст other-driver; это не свидетельство неограниченного роста.
Локальные проверки охватывают нормальную конфигурацию, пустой объект, неверные типы, отсутствующие лимиты, неположительные значения и слишком большие целые числа. Они не моделируют запись Docker на диск и не доказывают применение конфигурации, реальную ротацию или достаточный срок хранения.
6. Проверьте рост, доступность истории и состояние бизнеса
В изолированной тестовой среде проверьте ротацию конечным числом синтетических строк фиксированной длины без секретов. Не подключайте производственные тома и платные API. Ограничьте объём тестового вывода и задайте условие остановки; проверьте вытеснение старых и доступность новых записей, затем выбирайте производственные параметры. В рамках этой статьи такой опыт на реальном Docker не выполнялся.
| Результат проверки | Что исследовать дальше |
|---|---|
| Параметры нового контейнера верны, диск продолжает расти | Файлы приложения, базу, другие контейнеры и централизованное хранение |
| Ранние записи быстро исчезают | Вместимость по скорости роста, внешнее хранение и полноту сбора |
| Лимиты верны лишь у части экземпляров | Цели развёртывания, файлы переопределений и старые экземпляры |
| Сохраняются ошибки записи или расчётов | Восстановление бизнеса; свободное место не заменяет сверку состояния |
Режим non-blocking не заменяет ротацию: он меняет доставку сообщений, а при заполнении буфера новые записи отбрасываются. Полнота необходимых доказательств не гарантирована.[2] Если выбираете этот режим, определите допустимость потери логов и проверьте оповещения сборщика.
Сохраните среду, идентификаторы контейнеров, драйвер и лимиты, время изменения, свободное место и рост, доступное окно истории, результат бизнес-проверки и непроверенные области. При откате конфигурации повторите пересоздание и проверку. История, удалённая ротацией, не восстановится от возврата старых параметров.
7. Официальные источники и дата проверки
Источники проверены 2026-10-30. Это официальная документация Docker; часть страниц прочитана в виде Markdown из официальных репозиториев. Учитывайте установленную версию и среду.
- JSON File logging driver: стандартные ограничения, ротация, удаление старых файлов и границы доступа.
- Configure logging drivers: драйвер по умолчанию, отдельный контейнер, момент применения и режимы доставки.
- Local file logging driver: ротация, сжатие и внутренний формат.
- docker inspect: выбор типа объекта и шаблона вывода.
- Compose services: logging: драйвер и параметры сервиса.
- docker compose up: изменение конфигурации, пересоздание и смонтированные тома.