Come investigare un processo principale che è morto in un container docker?


13

A volte è necessario indagare su un contenitore che viene arrestato o un contenitore che dopo l'avvio si spegne molto rapidamente e si arresta.

docker exec -ti <id> bash Funziona solo su container in esecuzione, una volta terminato, termina anche il prompt di bash.

Con docker startte non puoi fornire un comando diverso e se il contenitore muore improvvisamente di nuovo non avrai abbastanza tempo per entrare nel contenitore e fare le tue indagini.

Possiamo fare docker commit, quindi, docker runsulla nuova immagine con un comando diverso, ma mi chiedo se ci siano altre alternative.

Nota : docker logsrestituisce semplicemente qualunque app stampata su stdout / stderr. Potrebbe non essere sufficiente per capire quale fosse il problema.


Dopo un po 'a pensarci: processo principale Docker ???? Come obiettivo del contenitore di eseguire solo un processo, o il termine "principale" deve essere rimosso, o stai facendo qualcosa di strano (come eseguire un processo di init), o stai prendendo thread come processi ... Presumo che sia opzione 1, ma ho dovuto dirlo perché mi disturba
— Tensibai

@Tensibai a volte devi eseguire qualcosa come dumb-init, per gestire il problema pid 1 / segnalazione nei container, se il tuo comando principale non può gestirlo da solo. Potrebbero esserci anche altri casi in cui un container docker esegue più di un processo
— SztupY

Sì, è quello che io chiamo strano, principalmente perché i contenitori sono stati realizzati per isolare un processo. A volte i contenitori non sono la soluzione per un'app, disposti a mettere tutto all'interno di un contenitore è più un percorso per il mal di testa che altro.
— Tensibai,

Risposte:


9

I modi generali per tenere traccia del perché un processo in Linux è fallito sono buoni. Uno di questi modi è quello di eseguire un processo straceche ti dirà come ha fatto il processo di chiamate di sistema e di solito indica il motivo di un errore.

Puoi creare un Dockerfileaspetto simile al seguente:

FROM original_image

RUN apt-get -y update && apt-get install -y strace

# build with `docker build -t debug_version`

Quindi esegui la tua nuova immagine usando docker run debug_version strace original_cmd.

Per i processi che fork i bambini (e poi muoiono) si desidera eseguire stracecon l' -ffopzione. Puoi anche mappare alcuni file usando i volumi di dati Docker e usare l' -oopzione da straceper scrivere su di esso. Ma in generale stracelascerà l'output su stdout, che è leggibile usando docker log.

D correlato : il processo Linux termina in modo misterioso


Questo vuol dire che devo ancora docker commitprima
— arrivare

Hai detto che muore all'inizio. Presumo che tu abbia un'immagine allora. Per quelli che sono stati arrestati, è necessario un commit.
— Evgeny

Questo è solo uno degli scenari per ottenere un container bloccato
— SztupY

Esiste anche un pacchetto per stracein Alpine Linux, pkgs.alpinelinux.org/package/edge/main/x86_64/strace . Utilizzare il gestore di pacchetti alpino per installarlo, apk install strace.
— Evgeny

3

Per quanto ne so, commite runsono le migliori opzioni qui per darti pieno accesso al contenitore com'era quando è morto.

Idealmente, il tuo contenitore sputerebbe alcune informazioni più utili quando fallisce, ma questo è un altro argomento del tutto.

Modifica: per espandere la mia risposta, se il contenitore sta morendo proprio all'inizio, puoi anche usare docker runper specificare un'alternativa --entrypointe CMD. Generalmente imposterò questo su un loop o qualcosa che non uscirà da solo. Una volta che sei nel contenitore, puoi eseguire manualmente i passaggi che non riescono e quindi ispezionare il risultato senza doversi preoccupare dell'uscita del contenitore.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.