Devo eseguire il process init all'interno di un contenitore Docker o no?

Ho recentemente ricercato alcune pratiche migliori su Docker e sono venuto in diverse opinioni su come o per gestire il process init.

Come sottolineato qui , il process di init non dovrebbe essere eseguito affatto. Posso seguire il pensiero che un contenitore dovrebbe modellare un singolo process e non l'integer sistema operativo.

D'altra parte, come descritto qui, ci possono essere dei problemi se ignoro i servizi OS di base come il syslog.

Come spesso c'è forse una risposta assoluta su come gestire questi casi. Puoi condividere alcune esperienze o ulteriori approfondimenti su questo argomento? Per me entrambi avvicinati sembrano legittimi.

Come spesso c'è forse una risposta assoluta su come gestire questi casi. Puoi condividere alcune esperienze o ulteriori approfondimenti su questo argomento? Per me entrambi avvicinati sembrano legittimi.

Punti su. Non esiste una risposta assoluta a questa domanda.

Ora, dopo aver detto questo, penso che ci siano notevoli vantaggi al model di un process per container, perché questo ti incoraggia davvero a creare contenitori componibili (come blocchi lego: puoi combinarli in combinazioni diverse per risolvere un problema) e che sono scalabili (puoi spinare più istanze di un particolare servizio senza troppi sforzi). Non facendo cose pazzesche come eseguire un demone ssh all'interno del tuo contenitore, sei scoraggiato di modificare le cose "in posto" e, probabilmente, avrà più probabilità di fare affidamento su Dockerfiles per generare le tue immagini, cosa che port a un sistema molto più robusto , process riproducibile.

D'altra parte, ci sono alcune applicazioni che non si prestano bene a questo model. Ad esempio, se si dispone di un'applicazione che richiede un sacco di processi infantili e non li wait() correttamente wait() , si finisce con una raccolta di processi zombi. È ansible eseguire un process init completo per risolvere questo particolare problema, oppure è ansible eseguire qualcosa di simile (disclaimer: ho scritto questo) o questo .

Alcune applicazioni sono accoppiate in maniera molto stretta e, sebbene sia ansible eseguirle in contenitori separati attraverso un'applicazione liberale dei volumi di Docker e di --net=container:... è più semplice farli funzionare nello stesso contenitore.

Logging in Docker è particolarmente impegnativo. L'esecuzione di una sorta di collettore di log all'interno di un contenitore con la tua applicazione può essere una soluzione a questo problema, ma ci sono anche altre soluzioni. Logspout è interessante, ma ho anche cercato di eseguire sisthemes all'interno dei contenitori per utilizzare il journald per la logging. Quindi, mentre sto ancora eseguendo un process di applicazione per contenitore, ho anche un process init e un process di journald .

Quindi, in definitiva, dipende veramente dalla situazione: sia sulle vostre esigenze che sulle esigenze della particolare applicazione che stai cercando di eseguire. Anche in situazioni in cui non è ansible un singolo process per contenitore, la progettazione dei contenitori per offrire un singolo servizio conferisce ancora molti dei vantaggi che ho citato nel primo paragrafo.