servicosgovbr / docker

Imagens Docker para o Portal de Serviços
MIT License
13 stars 9 forks source link

Troca o processo shell no container para a aplicação que iremos executar #15

Closed bltavares closed 8 years ago

bltavares commented 8 years ago

Processos em ambientes Linux utilizam sinais para comunicar mudanças, como quando são pedidos para parar um processo ou recarregar configurações.

Containers Docker conseguem repassar esses sinais para o processo que ele iniciou, mas alguns dos nossos casos, o processo inicial é um shell Bash. Shells Bash não repassam sinais para os processos filhos por padrão, o que pode levar que alguns containeres fiquem não responssivos.

Esse commit utiliza o comando exec para repassar a responsabilidade do processo Bash, após processar o que for necessário, para o processo filho.

Isso efetivamente troca o processo que está sendo executado no momento, removendo o processo Bash da cadeia de processamento de sinais.

Exemplo

Anteriormente, o container HAProxy estava assim:

Docker container -> Bash -> HAProxy

Ao enviar um docker kill para o container, o processo Bash receberia um sinal de parada, mas não necessariamente repassaria para o processo HAProxy. Isso impede que o processo interno tenha tempo para limpar qualquer coisa antes que um sinal de parada definitiva seja enviado.

Agora hierarquia de proceso será assim:

Docker container -> HAProxy

Após processar a informação necessaria no processo Bash, iremos trocar o processo para o processo filho diretamente. Os sinais agora serão enviados ao processo filho.

Mais detalhes disso estão disponiveis 'Scenario 1: A shell as PID 1' no seguinte post

cv commented 8 years ago

Excelente, @bltavares!

Haveria alguma vantagem neste caso em usar o dumb-init como PID 1?

bltavares commented 8 years ago

@cv O dumb-init tem duas vantagens sobre utilizar direto o processo que queremos executar:

Como o primeiro processo de um container tem um tratamento especial pelo Linux, é muito util ter um sistema simples que cuida desses casos especiais.

Eu desconsiderei introduzir o dumb-init por ser mais uma dependência, mas isso poderia ser feita em um outro PR caso seja de interesse para que já possamos repassar sinais para o HAProxy, o Portal e o Editor. Isso também permitiria discutir melhor apenas a parte do dumb-init.