À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 start
você, 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 run
em seguida, a nova imagem com um comando diferente, mas estou me perguntando se existem outras alternativas.
Nota : docker logs
apenas retorna os aplicativos impressos em stdout / stderr. Isso pode não ser suficiente para descobrir qual era o problema.
docker
containers
post-mortem
SztupY
fonte
fonte
Respostas:
Maneiras gerais de rastrear por que um processo no Linux falhou são boas. Uma dessas maneiras é executar um processo usando o
strace
qual informará o processo de chamadas do sistema e normalmente apontará o motivo de uma falha.Você pode criar um
Dockerfile
que se parece com isso: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
strace
com a-ff
opção Você também pode mapear algum arquivo usando os volumes de dados do Docker e usar a-o
opção destrace
para gravar nele. Mas, em geralstrace
, deixará a saída no stdout, que é legível usandodocker log
.Relacionados Q: processo Linux termina misteriosamente
fonte
docker commit
meu recipiente parou primeiro a ter uma imagem para começar a partir destrace
Alpine Linux, pkgs.alpinelinux.org/package/edge/main/x86_64/strace . Use o gerenciador de pacotes Alpine para instalá-loapk install strace
,.Tanto quanto sei,
commit
erun
sã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 run
para especificar uma alternativa--entrypoint
eCMD
. 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.fonte