Выбор ответа Senior Dockerfile и multi-stage обновлено
PID 1 в контейнере
Вопрос
Приложение в контейнере запускает дочерние процессы (например, конвертер изображений) и не ждёт их. Со временем ps показывает много <defunct>, а docker stop срабатывает только по таймауту. Что поможет лучше всего?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Запустить через init (tini, docker run --init): он пересылает сигналы и забирает зомби. PID 1 должен вызывать wait() для осиротевших потомков и корректно обрабатывать сигналы: ядро не применяет к PID 1 действия по умолчанию.
Варианты ответа
- Запускать контейнер с
--privileged, чтобы процесс мог сам прибирать потомков - Увеличить лимит памяти: зомби держат память, и
docker stopждёт её освобождения до таймаута - Добавить
HEALTHCHECK, чтобы Docker перезапускал контейнер при накоплении зомби - Запустить через init (
tini,docker run --init): он пересылает сигналы и забирает зомбиправильный ответ
Разбор
PID 1 должен вызывать wait() для осиротевших потомков и корректно обрабатывать сигналы: ядро не применяет к PID 1 действия по умолчанию. Обычное приложение этого не умеет. tini (встроен в Docker как --init) становится PID 1, пересылает сигналы приложению и прибирает зомби. Привилегии, память и healthcheck эту проблему не решают.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.