Como investigar um processo principal que morreu em um contêiner de docker?

13

Às vezes, é necessário investigar um contêiner que está parado ou um contêiner que, após a inicialização, morre muito rapidamente e para.

docker exec -ti <id> bash só funciona na execução de contêineres, quando termina, o prompt do bash também é finalizado.

Com docker startvocê, não é possível fornecer um comando diferente e, se o contêiner morrer abruptamente novamente, você não terá tempo suficiente para entrar no contêiner e fazer suas investigações.

Podemos fazer docker commit, docker runem seguida, a nova imagem com um comando diferente, mas estou me perguntando se existem outras alternativas.

Nota : docker logsapenas retorna os aplicativos impressos em stdout / stderr. Isso pode não ser suficiente para descobrir qual era o problema.

SztupY
fonte
Depois de um tempo pensando sobre isso: processo principal do Docker ???? Como um contêiner visa executar apenas um processo, o termo 'main' deve ser removido ou você está fazendo algo estranho (como executar um processo init) ou está usando threads como processos ... opção, mas eu tinha que dizer isso porque me incomoda
Tensibai
@Tensibai às vezes você precisa executar algo como dumb-init, para lidar com o problema pid 1 / signaling em contêineres, se o seu comando principal não puder lidar sozinho. Pode haver também outros casos em que um recipiente janela de encaixe é executado mais de processos
SztupY
Sim, é o que chamo de estranho, principalmente porque os contêineres foram feitos para isolar um processo. Às vezes, os contêineres não são a solução para um aplicativo; o desejo de colocar tudo dentro de um contêiner é mais um caminho para dores de cabeça do que qualquer outra coisa.
Tensibai

Respostas:

9

Maneiras gerais de rastrear por que um processo no Linux falhou são boas. Uma dessas maneiras é executar um processo usando o stracequal informará o processo de chamadas do sistema e normalmente apontará o motivo de uma falha.

Você pode criar um Dockerfileque se parece com isso:

FROM original_image

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

# build with `docker build -t debug_version`

Em seguida, execute sua nova imagem usando docker run debug_version strace original_cmd.

Para processos que bifurcam filhos (e depois morrem), você deseja executar stracecom a -ffopção Você também pode mapear algum arquivo usando os volumes de dados do Docker e usar a -oopção de stracepara gravar nele. Mas, em geral strace, deixará a saída no stdout, que é legível usando docker log.

Relacionados Q: processo Linux termina misteriosamente

Evgeny
fonte
Isso significa que eu ainda tenho que docker commitmeu recipiente parou primeiro a ter uma imagem para começar a partir de
SztupY
Você disse que morre no começo. Presumo que você tenha uma imagem então. Para aqueles que estão parados, sim, é necessário um commit.
Evgeny
Isso é apenas um dos cenários para obter um recipiente parado
SztupY
Há também um pacote para o straceAlpine Linux, pkgs.alpinelinux.org/package/edge/main/x86_64/strace . Use o gerenciador de pacotes Alpine para instalá-lo apk install strace,.
Evgeny
3

Tanto quanto sei, commite runsão as melhores opções aqui para fornecer acesso total ao contêiner como estava quando ele morreu.

Idealmente, seu contêiner cuspia algumas informações mais úteis quando falha, mas esse é outro tópico.

Editar: para expandir minha resposta, se o contêiner estiver morrendo logo no início, você também pode usar docker runpara especificar uma alternativa --entrypointe CMD. Geralmente, definirei isso como um loop ou algo que não saia por conta própria. Quando estiver no contêiner, você pode executar manualmente as etapas que estão falhando e depois inspecionar o resultado sem precisar se preocupar com a saída do contêiner.

tênia
fonte