mentre possiamo installare processo multiplo senza supervisore, solo un processo può essere eseguito quando conduzione finestra mobile viene emesso e quando il contenitore viene arrestata solo il PID 1 saranno trasmessi segnali e altri processi in esecuzione no essere fermato con grazia
Sì, anche se dipende da come viene eseguito il processo principale (in primo piano o in background) e come raccoglie i processi figli.
Questo è ciò che è descritto nel "Trapping signals in Docker containers"
docker stop
ferma un contenitore in esecuzione con l'invio del segnale SIGTERM
, lasciare che il processo di processo principale, e dopo un periodo di grazia utilizza SIGKILL
per terminare l'applicazione.
Il segnale inviato al contenitore viene gestito dal processo principale in esecuzione (PID 1).
Se l'applicazione è in primo piano, ovvero l'applicazione è il processo principale in un contenitore (PID1), può gestire direttamente i segnali.
Ma:
Il processo deve essere segnalata potrebbe essere lo sfondo uno e non è possibile inviare direttamente i segnali. In questo caso, una soluzione consiste nell'impostare uno script di shell come punto di accesso e orchestrare tutta l'elaborazione del segnale in quello script.
La questione è ulteriormente trattati nella "Docker and the PID 1 zombie reaping problem"
Unix è progettato in modo tale che i processi genitori devono esplicitamente "attesa" per la terminazione processo figlio, al fine di raccogliere il suo stato di uscita.Il processo zombie esiste fino a quando il processo padre ha eseguito questa azione, utilizzando la famiglia di chiamate di sistema waitpid()
.
L'azione di chiamare waitpid() su un processo figlio per eliminare il suo zombi, viene chiamata "mietitura".
Il processo init
- PID 1 - ha un compito speciale. Il suo compito è di "adottare" processi figli orfani.
Il sistema operativo si aspetta che il processo init di raccogliere i bambini adottati troppo.
problema con Docker:
vediamo che un sacco di gente correre solo un processo nel loro contenitore, e pensano che quando corrono questo singolo processo, hanno finito.
Ma molto probabilmente, questo processo non viene scritto per comportarsi come un processo di init corretto.
Cioè, invece di appropriarsi correttamente dei processi, probabilmente si aspetta un altro processo init
per fare quel lavoro, e giustamente.
L'utilizzo di un'immagine come phusion/baseimage-docker
consente di gestire uno o più processi mantenendo un processo principale conforme a init.
Esso utilizza runit
instead of supervisord
, per la gestione multi-processo:
Runit non è lì per risolvere il problema mietitura. Piuttosto, è per supportare più processi. Sono incoraggiati più processi per la sicurezza (attraverso il processo e l'isolamento dell'utente).
Runit utilizza meno memoria di Supervisord perché Runit è scritto in C e Supervisord in Python.
E in alcuni casi di utilizzo, il riavvio del processo nel contenitore è preferibile rispetto ai riavvii di interi contenitori.
Questa immagine include uno my_init
script che si occupa del problema "mietitura".
In baseimage-docker, si consiglia di eseguire più processi in un unico contenitore. Non necessariamente servizi multipli però.
Un servizio logico può essere costituito da più processi del sistema operativo e forniamo le funzionalità per farlo facilmente.
Aggiornamento Sett 2016: vedere [la mia nuova risposta ] (http://stackoverflow.com/a/39593409/6309) di seguito: il daemon docker potrebbe occuparsi di quei processi zombi per te nella finestra mobile 1.12. – VonC