РуководстваОпубликовано: 30.10.2026• 0 просмотров

Логи 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 из официальных репозиториев. Учитывайте установленную версию и среду.

  1. JSON File logging driver: стандартные ограничения, ротация, удаление старых файлов и границы доступа.
  2. Configure logging drivers: драйвер по умолчанию, отдельный контейнер, момент применения и режимы доставки.
  3. Local file logging driver: ротация, сжатие и внутренний формат.
  4. docker inspect: выбор типа объекта и шаблона вывода.
  5. Compose services: logging: драйвер и параметры сервиса.
  6. docker compose up: изменение конфигурации, пересоздание и смонтированные тома.
Опубликовано: 30 октября 2026 г.
最后更新: 30.10.2026

Похожие статьи

Руководства

Длинный ID из API изменился во фронтенде? Точность JavaScript и передача строк

Изменились последние цифры ID, поиск вернул 404 или номера в счёте слились? Проверьте текст JSON, разбор, хранение и повторную отправку; узнайте, почему String и BigInt иногда уже не помогут, и проверьте передачу строковых ID на локальных примерах.

Руководства

Как считать стабильность API: исходные запросы, повторы и конечная успешность

Успех после повтора нельзя считать новым независимым успехом. Статья разделяет request_id, попытки и конечные состояния, объясняет границы 429, 503, тайм-аутов и идемпотентности, а локальный скрипт считает конечную успешность и усиление повторами.

Руководства

API вернул 202 без результата: состояния асинхронных заданий, опрос и повторная отправка

Различайте приём задания, успешную проверку статуса и завершение работы. Сохраняйте ID, ограничивайте опрос и разбирайте 404, истечение срока результата и неизвестный исход отправки без повторного создания задания.

Отказ от ответственности

Данные о сервисах и ценах вводятся вручную; доступность сайтов проверяется автоматически с указанием времени последней проверки.Информация о провайдерах может меняться, поэтому перед оплатой рекомендуем посетить официальный сайт сервиса. Мы не гарантируем качество услуг сторонних провайдеров.

© 2026 Выбор API. All rights reserved.