Node.js LinuxWindowsNode.js

Node.js: Приложение Node.js не получает сигнал завершения в Docker

  • Обновлено
  • Чтение ≈ 3 минуты

Краткий ответ

В контейнере Docker приложение Node.js не успевает закрыть сервер при docker stop: обработчик SIGTERM не вызывается, активные операции обрываются. Причиной может быть оболочка как PID 1 либо отсутствие обработчика завершения.

В этой статье
  1. Симптомы и условия возникновения
  2. Причины и как их отличить
  3. Пошаговая диагностика и решение
  4. Как проверить результат и что делать, если не помогло

#Симптомы и условия возникновения

В контейнере Docker приложение Node.js не успевает закрыть сервер при docker stop: обработчик SIGTERM не вызывается, активные операции обрываются. Причиной может быть оболочка как PID 1 либо отсутствие обработчика завершения. Для начала проверьте используемую версию среды и точный текст ошибки на копии проекта, не меняя рабочий сервер.

#Причины и как их отличить

Возможная причинаКак узнатьЧто делать
Shell-форма запускаВ этой ситуации наблюдается конкретный диагностический признак. Сопоставьте его с журналом ошибки и результатом соответствующей проверки, прежде чем выбирать исправление.CMD node server.js через /bin/sh -cЗаменить на exec-форму для прямой доставки сигнала.
Нет обработчика SIGTERMВ этой ситуации наблюдается конкретный диагностический признак. Сопоставьте его с журналом ошибки и результатом соответствующей проверки, прежде чем выбирать исправление.Node получает сигнал и завершает процесс без закрытия соединенийУстановить обработчик и завершать HTTP-сервер штатно.
Нехватка времени остановкиВ этой ситуации наблюдается конкретный диагностический признак. Сопоставьте его с журналом ошибки и результатом соответствующей проверки, прежде чем выбирать исправление.Контейнер остановлен принудительно после тайм-аутаУменьшить время очистки, согласовать grace period.

#Пошаговая диагностика и решение

  1. 1. Создайте тестовый контейнер с той же конфигурациейСохраните Dockerfile и настройки запуска; используйте отдельный контейнер без рабочих данных. Остановите его командой docker stop и посмотрите последние записи журнала, не удаляя рабочий контейнер.
  1. 2. Проверьте команду контейнера и PID 1Откройте Dockerfile. Вариант CMD node server.js запускает команду через shell, которая может не переслать SIGTERM. Рекомендуемая форма: CMD ["node","server.js"]; для ENTRYPOINT действует тот же принцип.
  1. 3. Добавьте логируемый обработчик сигналаВ тестовый сервер добавьте process.once("SIGTERM", shutdown) с вызовом server.close(). Убедитесь, что server — реальный объект от listen; предусмотрите обработку ошибки и ожидание активных запросов.
  1. 4. Пересоберите только тестовый образВ каталоге копии Dockerfile выполните сборку с отдельной меткой. Сборка запускает инструкции Dockerfile, поэтому используйте доверенные зависимости и не передавайте секреты в аргументах сборки.
  2. Терминал с доступом к тестовому Docker; точка — текущий каталог с Dockerfile
    Linux · Терминал (Bash)Команда
    Терминал с доступом к тестовому Docker; точка — текущий каталог с Dockerfile.
    docker build -t node-graceful-test .
  1. 5. Запустите проверку завершенияСоздайте тестовый контейнер, запросите пробную страницу и выполните docker stop по его имени. Просмотрите журнал: ожидается отметка обработчика и штатное закрытие без SIGKILL. При неуспехе проверьте PID 1 и время ожидания.
    Linux · Терминал (Bash)С осторожностью
    Docker-хост с правами на управление контейнерами; используйте только отдельно созданный тестовый контейнер с этим именем. Ожидается его штатная остановка, а не изменение рабочего приложения.
    docker stop node-graceful-test-container

    Команда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.

  1. 6. Не затягивайте завершение бесконечноНовые запросы после SIGTERM должны прекращаться. Для долгих запросов установите рассчитанное максимальное ожидание; не допускайте зависания shutdown. У Docker настраивается тайм-аут остановки, но он не заменяет обработку сигнала.
  1. 7. Внедрите после проверкиПеренесите изменения из тестовой копии и остановите/обновите экземпляры через согласованный процесс развёртывания. Если клиенты теряют запросы, откатите образ и исследуйте лог до остановки.
  2. Пример кода по теме
    Текст
    Пример для тестовой копии, где app уже существует; фоновые задания и БД требуют собственной последовательности закрытия.
    const server = app.listen(3000); // app — уже созданное приложение
    let closing = false;
    process.once('SIGTERM', () => {
      if (closing) return;
      closing = true;
      console.log('SIGTERM: закрываем HTTP-сервер');
      server.close((err) => {
        if (err) console.error(err);
        process.exitCode = err ? 1 : 0;
      });
    });

#Как проверить результат и что делать, если не помогло

При docker stop появляется отметка SIGTERM и завершающая запись приложения, активные ответы успешно заканчиваются в допустимое время.

Если неисправность повторилась, выпишите первый код ошибки и действие, на котором она возвращается. Сравните версию Node.js/npm, рабочий каталог, настройки процесса и журнал тестового запуска. Откатите только внесённые изменения из предварительно сохранённой копии, затем разберите причину на отдельной среде.

Так эту ошибку тоже называют

Источники и обновления

Последнее обновление статьи: 2 ноября 2026. Версии программ и интерфейсы меняются — если шаги не совпадают с вашей версией, сверяйтесь с документацией производителя.