Вступить в клуб →
сложнаявопросDocker и сборка образов

Контейнер игнорирует SIGTERM и умирает по таймауту

Сервис описан так:

FROM node:20-slim
WORKDIR /app
COPY . .
CMD npm start

При каждом релизе часть запросов обрывается: остановка контейнера занимает ровно период ожидания (10 секунд), после чего процесс убивается принудительно. Обработчик SIGTERM в приложении написан и локально работает: сервис закрывает keep-alive соединения и завершается за 1-2 секунды.

Внутри работающего контейнера дерево процессов такое:

PID   COMMAND
  1   /bin/sh -c npm start
  7   npm start
 18   node /app/server.js

Что здесь происходит и как это чинить? Выберите все верные утверждения.

правильных вариантов может быть несколько

  • Из-за shell-формы `CMD` процессом с PID 1 становится оболочка: сигнал приходит ей, а дочернему процессу приложения не пересылается
  • Помогает exec-форма с прямым запуском процесса — `CMD ["node", "server.js"]`: тогда PID 1 становится само приложение и SIGTERM приходит именно ему
  • Нужно увеличить период ожидания остановки флагом `--stop-timeout`: сервису просто не хватает стандартных 10 секунд, чтобы закрыть keep-alive соединения и корректно выйти
  • Docker всегда отправляет SIGKILL сразу, обработчик SIGTERM в контейнере не вызывается в принципе
  • Причина в базовом образе slim: в нём вырезана поддержка обработки сигналов

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела