Eu usei esta resposta como um guia para me ajudar a escrever um script de inicialização para systemd iniciar meu contêiner Jenkins quando meu a máquina arranca. No entanto, o script não está funcionando. Aqui está o script:
[Unit]
Description=Docker container that houses the Jenkins build service.
After=network-online.target
[Service]
Group=docker
ExecStart=/usr/bin/docker start jenkins
ExecStop=/usr/bin/docker stop jenkins
[Install]
WantedBy=multi-user.target
Coloquei em /etc/systemd/system/jenkins.service
.
Quando executo sudo systemctl start jenkins
, nada acontece. Nenhum erro ou qualquer coisa impressa e o contêiner não inicia (se eu executar docker ps
, não há contêineres listados como em execução).
Eu posso executar /usr/bin/docker start jenkins
da linha de comando manualmente e ela começa perfeitamente bem, então o problema parece estar na maneira como escrevi o script, mas não consigo entender por que ele não está funcionando como esperado. Qualquer ajuda é apreciada.
Atualização:
Atualizei o script alterando os valores de ExecStart
e ExecStop
para /bin/sh -c '/usr/bin/docker start jenkins'
e /bin/sh -c '/usr/bin/docker stop jenkins'
, respectivamente, mas isso ainda não funcionou.
Atualização 2:
Eu atualizei o ExecStart
e o ExecStop
removendo o /bin/sh -c "..."
e apenas colocando o comando entre aspas duplas, mas agora obtenho uma saída interessante em sudo systemctl status jenkins
:
$ sudo systemctl status jenkins
● jenkins.service - Docker container that houses the Jenkins build service.
Loaded: loaded (/etc/systemd/system/jenkins.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Sun 2017-12-03 12:20:39 EST; 10s ago
Process: 1513 ExecStop=/usr/bin/docker stop jenkins (code=exited, status=203/EXEC)
Process: 1511 ExecStart=/usr/bin/docker start jenkins (code=exited, status=203/EXEC)
Main PID: 1511 (code=exited, status=203/EXEC)
Dec 03 12:20:39 evt-jenkins systemd[1]: Started Docker container that houses the Jenkins build service..
Dec 03 12:20:39 evt-jenkins systemd[1]: jenkins.service: Main process exited, code=exited, status=203/EXEC
Dec 03 12:20:39 evt-jenkins systemd[1]: jenkins.service: Control process exited, code=exited status=203
Dec 03 12:20:39 evt-jenkins systemd[1]: jenkins.service: Unit entered failed state.
Dec 03 12:20:39 evt-jenkins systemd[1]: jenkins.service: Failed with result 'exit-code'.
Existe uma maneira de ver exatamente o que está falhando? Esses códigos de erro não são realmente indicativos de nada.
Atualização 3:
Ok, então eu olhei de novo e removi as aspas. O arquivo jenkins.service
agora é lido exatamente como na parte superior da questão. Quando eu recarregar o systemd e iniciar o serviço, esta é a saída de sudo systemctl status jenkins
:
$ sudo systemctl status jenkins
● jenkins.service - Docker container that houses the Jenkins build service.
Loaded: loaded (/etc/systemd/system/jenkins.service; enabled; vendor preset: enabled)
Active: inactive (dead) since Sun 2017-12-03 12:31:59 EST; 2s ago
Process: 1683 ExecStop=/usr/bin/docker stop jenkins (code=exited, status=0/SUCCESS)
Process: 1594 ExecStart=/usr/bin/docker start jenkins (code=exited, status=0/SUCCESS)
Main PID: 1594 (code=exited, status=0/SUCCESS)
Dec 03 12:31:59 evt-jenkins systemd[1]: Started Docker container that houses the Jenkins build service..
Dec 03 12:31:59 evt-jenkins docker[1594]: jenkins
Dec 03 12:31:59 evt-jenkins docker[1683]: jenkins
Assim, o systemd não apenas relata uma execução bem-sucedida do script, mas também mostra a saída correta de iniciar um contêiner por seu nome (em vez de seu SHA). Mas quando eu corro docker ps
, não há nada listado !! Posso lembrar que, quando executo o comando docker manualmente, o contêiner é executado bem.
Alguma ideia? O Systemd está se mostrando bastante difícil de se trabalhar.
Atualização 4:
Ok, apenas notei algo muito estranho acontecendo aqui. Se você notar no snippet acima (a saída de sudo systemctl status jenkins
), você notará que o PID de ExecStart
é 1594 e o PID de ExecStop
é 1683. Agora, mais abaixo na saída, você Verá que a saída do ExecStart
está chegando primeiro, antes do ExecStop
. Eu não tenho certeza se isso seria por causa do buffer de saída, ou se o systemd está fazendo o ExecStart
executar antes do ExecStop
.