Насколько критичен dumb-init для Docker?

22

Я надеюсь, что этот вопрос не будет отмечен как primarily opinion-based , но есть объективный ответ на него.

Я прочитал Представляем dumb-init, систему init для Docker контейнеры , в котором подробно описывается, почему и как использовать dumb-init . Честно говоря, для кого-то, кто не слишком разбирается в том, как работает структура процесса Linux, это звучит довольно драматично - и кажется, что вы делаете все совершенно неправильно, если не используете dumb-init .

Вот почему я думаю об использовании этого в моих собственных изображениях Docker ... что мешает мне сделать это - это тот факт, что я еще не нашел официального изображения Docker, которое его использует.

  • Возьмем mongo в качестве примера: они напрямую ссылаются на mongod .
  • Возьмите postgres в качестве примера: они напрямую ссылаются на postgres .
  • Возьмите узел в качестве примера: они напрямую ссылаются на node .
  • ...

Если dumb-init , поэтому важно - почему, по-видимому, никто не использует его? Что мне здесь не хватает?

    
задан Golo Roden 22.05.2016 в 14:21
источник
  • (Отказ от ответственности: я являюсь сторонником Tini - Tini и dumb-init - легкие системы инициализации для контейнеров). Обратите внимание, что некоторые официальные изображения Docker используют такую ​​систему init: Redmine, Kibana, Mongo-express, Sentry, Jenkins - хорошие примеры. Как вы заметили, это чаще всего полезно для полноценных приложений, а не для языка. –  Thomas Orozco 06.06.2016 в 09:44
  • @ThomasOrozco: Можете ли вы прокомментировать техническую сторону, какая разница между tini и dumb-init? Просто узнав об этих двух и интересно узнать историю tini, что зуд был поцарапан тупой-init. Из описаний они, похоже, делают то же самое (еще не сравнивали исходный код). –  hakre 19.05.2017 в 23:27
  • @hakre Я считаю, что люди, которые не знали об этом, не знали о Тини, когда они его написали, поэтому не так, как они нашли что-то принципиально неправильное с Tini, которое они хотели исправить с помощью dumb-init :). Есть несколько отличий между ними. Например, они поддерживают переписывание сигналов, а Tini - нет, но Tini поддерживает подпоры, а они нет. В целом, однако, если вы ищете жатву зомби, и все, так или иначе. –  Thomas Orozco 20.05.2017 в 11:09
  • @ThomasOrozco: Спасибо за объяснение. Это все ново для меня, и мне все еще нужно выяснить, есть ли вообще проблема с Зомби, поскольку я еще не понял, как я могу спровоцировать это, чтобы проверить это. –  hakre 20.05.2017 в 11:28
  • Теперь запуск Docker имеет флаг -init: запустите init внутри контейнера, который пересылает сигналы и использует процессы. Похоже, что реализация происходит непосредственно из tini –  lightswitch05 22.05.2018 в 18:28

1 ответ

15

Что-то вроде dumb-init или tini можно использовать, если у вас есть процесс, который порождает новые процессы, и у вас нет хороших обработчиков сигналов, реализованных для обнаружения дочерних сигналов и остановки вашего ребенка, если ваш процесс должен быть остановлен и т. д.

Если ваш процесс не порождает новые процессы (например, Node.js), это может быть необязательно.

Я предполагаю, что MongoDB, PostgreSQL, ... которые могут запускать дочерние процессы, имеют хорошие обработчики сигналов. В противном случае были бы процессы зомби, и кто-то задал проблему, чтобы исправить это.

Только проблема может быть официальными языковыми изображениями, такими как узел, рубин, golang. У них нет дум-init / tini в нем, как вам обычно не нужны. Но разработчик может реализовать неправильный код для выполнения дочерних программ, чтобы либо исправить обработчики сигналов, либо использовать хелпер в качестве PID 1.

    
ответ дан Stefan Scherer 22.05.2016 в 22:20
  • Хорошо, спасибо :-) –  Golo Roden 22.05.2016 в 22:45
  • Это не совсем так. Например, сценарии Bash НЕ обрабатывают и не испускают сигналы должным образом. Также Mongo / Postgres RELY в ОС init системы для обработки зомби и обработки пожилых детей процессов. Это так, как это работает. Кроме того, у докера в ближайшее время будет свой собственный обработчик инициализации (теперь он объединен в master), но пока у вас нет версии, которая поддерживает это, вы всегда должны иметь процесс PID1, который может использовать процессы. См .: blog.phusion.nl/2015/01/20/... –  Lu.nemec 27.10.2016 в 10:10
  • Многие официальные изображения ввели gosu, например. mongo's entrypoint.sh как процесс PID1. –  Stefan Scherer 04.12.2016 в 11:02