A inclusão de comandos ExecStop faz com que o serviço (consul) falhe ao iniciar corretamente

2

Eu estou monkeying com consul tentando configurar um pequeno cluster CoreOS. Se eu salvar o seguinte arquivo em /etc/systemd/system/consul.service , ativar o serviço e reinicializar a VM, todos os 3 vms do cluster serão inicializados adequadamente e se unirão

[Unit]
Description=consul
After=etcd2.service
After=docker.service

[Service]
TimeoutStartSec=0
ExecStartPre=-/usr/bin/docker kill consul
ExecStartPre=-/usr/bin/docker rm consul
ExecStart=/usr/bin/docker run -d --name consul --network host consul agent -server -bootstrap-expect=3 -data-dir /tmp/consul -bind BIND_IPADDR --node NODE_NAME -retry-join IPADDR1 -retry-join IPADDR2
# ExecStop=/usr/bin/docker container exec consul consul leave
# ExecStopPost=/usr/bin/docker container stop consul
# ExecStopPost=/usr/bin/docker container rm consul

[Install]
WantedBy=multi-user.target

Se, no entanto, eu remover os comentários dos comandos ExecStop , a inicialização falhará, no sentido de que nenhum contêiner cônsul está em execução após a reinicialização do vms. systemctl --failed não reporta nenhum serviço como tendo falhado.

O que estou fazendo de errado? Estou entendendo mal o ExecStop ? Consul ?

    
por Elliot 21.10.2018 / 21:14

1 resposta

2

O problema (ou pelo menos um problema) é que você está usando o -d flag do docker (para "desanexado") no seu ExecStart= .

O systemd espera que o comando que ele executa permaneça em execução enquanto o serviço está ativo, em outras palavras, para ser executado em primeiro plano. Pelo menos ao configurar serviços de Type=simple , que é o tipo padrão e o que se aplica à sua unidade.

Quando você está executando um comando que sai imediatamente (como docker run -d ), o systemd assume que seu serviço é iniciado e permanece ativo apenas por um momento, até que seja concluído. Então, enquanto o seu contêiner ainda estiver ativo, o serviço systemd vai achar que não. Você pode confirmar isso com um comando como systemctl status consul.service . (Verifique este comando com frequência para ajudá-lo a entender o que o systemd acha que o status do seu serviço é. Poste sua saída aqui para nos ajudar a diagnosticar quaisquer outros problemas que você esteja tendo também.)

O que está lhe causando problemas quando você tem alguns comandos ExecStopPost= é que o systemd executará esses comandos, já que ele supõe que o serviço está terminado, matando assim o seu contêiner.

Basta remover o -d de seu docker run no comando ExecStart= para resolver seu problema.

    
por 21.10.2018 / 21:59