Справочник системных ошибок и решений

Windows Server, Active Directory, 1С:Предприятие, СУБД, Linux, Cisco, MikroTik, Asterisk.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты на сайте предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, программного обеспечения, баз данных, сетевого оборудования и других компонентов инфраструктуры. Перед выполнением действий создайте резервную копию и по возможности протестируйте изменения в безопасной среде. Пользователь самостоятельно оценивает риски и несет ответственность за результат. При отсутствии необходимых знаний обратитесь к квалифицированному ИТ-специалисту.

DOCKER_PID1_ZOMBIE_REAPING Linux / DevOps

Траблшутинг Init-процесса в Docker: tini, dumb-init и проброс сигналов SIGTERM

Обновлено: 21.08.2026
  • Команда docker stop выполняется ровно 10 секунд и убивает контейнер принудительно сигналом SIGKILL.
  • Внутри контейнера накапливаются сотни зомби-процессов (состояние [defunct] или Z в ps).
  • Приложение на Node.js, Python или Java игнорирует сигнал SIGTERM и не успевает корректно закрыть соединения с БД (Graceful Shutdown).

1. Причина проблемы: Специфика процесса PID 1 в Linux

В ядре Linux процесс с идентификатором PID 1 не имеет стандартных обработчиков сигналов по умолчанию. Если приложение явно не регистрирует перехват SIGTERM, ядро полностью игнорирует сигнал остановки.

2. Использование встроенного в Docker механизма Init (--init)

Docker содержит встроенный легковесный init-процесс Tini:

docker run -d --name my_app --init my_node_app:latest

3. Интеграция Tini напрямую в Dockerfile

FROM alpine:3.19
RUN apk add --no-cache tini
WORKDIR /app
COPY . .

# Запуск Tini в качестве PID 1
ENTRYPOINT ["/sbin/tini", "--"]
CMD ["node", "server.js"]

4. Использование dumb-init для Debian/Ubuntu образов

FROM debian:12-slim
RUN apt-get update && apt-get install -y --no-install-recommends dumb-init
WORKDIR /app
COPY . .

ENTRYPOINT ["dumb-init", "--"]
CMD ["python3", "app.py"]

5. Проверка корректного синтаксиса CMD (Exec Form vs Shell Form)

Всегда используйте синтаксис массива JSON (Exec Form):

# ПРАВИЛЬНО (Exec Form: приложение становится прямым потомком init):
CMD ["node", "app.js"]

# НЕПРАВИЛЬНО (Shell Form: запускается /bin/sh -c, блокирующий сигналы):
CMD node app.js
💡 Практика специалистов: Если вы упаковываете приложения на Node.js или Python без использования Tini/dumb-init, они гарантированно ломают Graceful Shutdown при деплое в Kubernetes или Docker Swarm, приводя к потере обрабатываемых HTTP-запросов.

Частые вопросы (FAQ)

Что такое Zombie Reaping и почему этим должен заниматься PID 1?

Когда дочерний процесс завершается, он остается в таблице процессов как зомби до тех пор, пока родительский процесс не вызовет wait(). Если родитель завершился раньше, осиротевший процесс перепривязывается к PID 1. Tini и dumb-init автоматически вызывают wait() и очищают таблицу процессов.

Как увеличить стандартный таймаут ожидания docker stop?

Используйте флаг -t: docker stop -t 30 <container_id> (ожидание 30 секунд перед отправкой SIGKILL).

Полезные материалы
Рекомендуем