Выбор ответа Senior Dockerfile и multi-stage обновлено

PID 1 в контейнере

Вопрос

Приложение в контейнере запускает дочерние процессы (например, конвертер изображений) и не ждёт их. Со временем ps показывает много <defunct>, а docker stop срабатывает только по таймауту. Что поможет лучше всего?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Запустить через init (tini, docker run --init): он пересылает сигналы и забирает зомби. PID 1 должен вызывать wait() для осиротевших потомков и корректно обрабатывать сигналы: ядро не применяет к PID 1 действия по умолчанию.

Варианты ответа

  1. Запускать контейнер с --privileged, чтобы процесс мог сам прибирать потомков
  2. Увеличить лимит памяти: зомби держат память, и docker stop ждёт её освобождения до таймаута
  3. Добавить HEALTHCHECK, чтобы Docker перезапускал контейнер при накоплении зомби
  4. Запустить через init (tini, docker run --init): он пересылает сигналы и забирает зомбиправильный ответ

Разбор

PID 1 должен вызывать wait() для осиротевших потомков и корректно обрабатывать сигналы: ядро не применяет к PID 1 действия по умолчанию. Обычное приложение этого не умеет. tini (встроен в Docker как --init) становится PID 1, пересылает сигналы приложению и прибирает зомби. Привилегии, память и healthcheck эту проблему не решают.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.