2016-05-22 23 views
19

Mam nadzieję, że to pytanie nie zostanie oznaczone jako primarily opinion-based, ale istnieje obiektywna odpowiedź na to pytanie.Jak ważny jest dumb-init dla Docker?

Przeczytałem Introducing dumb-init, an init system for Docker containers, który obszernie opisuje, dlaczego i jak używać dumb-init. Szczerze mówiąc, dla kogoś niezbyt doświadczonego w działaniu struktury procesu Linuksa brzmi to dość dramatycznie - i wydaje się, że robisz coś zupełnie nie tak, jeśli nie używasz dumb-init.

Dlatego właśnie myślę o używaniu go w moich własnych obrazach Docker ... co powstrzymuje mnie przed zrobieniem tego, to fakt, że jeszcze nie znalazłem oficjalnego obrazu Docker, który go używa.

  • Jako przykład można podać mongo. Nazywają one mongod bezpośrednio.
  • Jako przykład można podać postgres. Dzwonią bezpośrednio pod numer postgres.
  • Jako przykład można podać node. Nazywają się one bezpośrednio pod numerem node.
  • ...

Jeśli dumb-init jest tak ważne - dlaczego jest najwyraźniej nikt go nie używasz? Czego tu mi brakuje?

+4

(Zastrzeżenie: jestem opiekunem Tini-Tini i dumb-init są lekkimi systemami init do pojemników). Zwróć uwagę, że niektóre oficjalne obrazy Docker używają takiego systemu inicjalizacji: Redmine, Kibana, Mongo-express, Sentry, Jenkins są dobrymi przykładami. Jak zauważyłeś, jest to bardziej przydatne w przypadku pełnowartościowych aplikacji niż w środowisku wykonawczym języka. –

+0

@ThomasOrozco: Czy możesz skomentować techniczną stronę jaka jest różnica między tini a dumb-init? Właśnie się o nich dowiaduję i zastanawiam się z historią tini, co to było drapanie głuchego inicjałem. Z opisów wydają się robić to samo (jeszcze nie porównali kodu źródłowego). – hakre

+3

@hakre Wierzę, że ludzie dumb-init nie byli świadomi Tini, kiedy to napisali, więc nie jest tak, że znaleźli coś fundamentalnie złego w Tini, które chcieli naprawić głupim inicjałem :). Istnieje kilka różnic między tymi dwoma cechami. Na przykład obsługują przepisywanie sygnału, a Tini nie, ale Tini obsługuje podtytuły, a nie. Ogólnie rzecz biorąc, jeśli szukasz zbierania zombie i to wszystko, albo to zrobimy. –

Odpowiedz

13

Coś dumb-init lub tini mogą być stosowane, jeżeli masz proces, który spawns nowe procesy i nie ma dobrych obsługi sygnałów realizowane złapać sygnały dziecko i zatrzymać swoje dziecko, jeśli proces powinien zostać zatrzymany itp

Jeśli twój proces nie odradza nowych procesów (np. Node.js), może nie być to konieczne.

Przypuszczam, że MongoDB, PostgreSQL, ... które mogą uruchamiać procesy potomne, mają zaimplementowane dobre procedury obsługi sygnałów. W przeciwnym razie byłyby procesy zombie i ktoś zadał pytanie, żeby to naprawić.

Jedynym problemem mogą być oficjalne obrazy językowe, takie jak węzeł, rubin, golang. Nie mają w nim dumb-init/tini, ponieważ zwykle ich nie potrzebujesz. Ale to programista może zaimplementować nieprawidłowy kod wykonania podrzędnego, aby naprawić obsługę sygnału lub użyć pomocnika jako PID 1.

+0

Ok, dzięki :-) –

+1

To nie jest do końca prawdą. Skrypty Bash na przykład NIE obsługują i nie wysyłają sygnałów poprawnie. Również Mongo/Postgres polegać na init OS-ów do obsługi zombie i obsługiwać czerpania dzieci procesów. Tak po prostu działa. Również doker wkrótce będzie miała swój własny program obsługi startowy (obecnie połączone w pana), ale dopóki nie masz wersję, która obsługuje tę należy zawsze mieć proces PID1 które mogą czerpać procesów. Patrz: https://blog.phusion.nl/2015/01/20/docker-and-the-pid-1-zombie-reaping-problem/ –

+1

Wiele oficjalnych zdjęć wprowadziły [gosu] (https: //github.com/tianon/gosu), np. [Entrypoint.sh Mongo'S] (https://github.com/docker-library/mongo/blob/5f4bcf4bec163ef05b4fc67d5c92762989dbde06/3.4/docker-entrypoint.sh) jako proces PID1. –