Script de inicialização do Systemd para o contêiner do docker não funcionar

1

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 .

    
por wheeler 03.12.2017 / 18:19

2 respostas

2

Existe um motivo pelo qual você tenta fazer isso com um script de inicialização do systemd e não com os mecanismos do docker como restart: always ?

Estamos usando o docker-compose.yml e é assim:

docker-compose.yml

version: '2'

services:
  jenkins:
    image: ###OWN_JENKINS_IMAGE###
    restart: always
    mem_limit: 2100m
    networks:
      - web
      - dockerhub
    environment:
      - "REVERSE_PROXY_PORT=8080"
      - "REVERSE_PROXY_HOSTNAME=####INTERNAL_HOSTNAME####"
      - "X_PROXY_PORT=443"
      - "X_PROXY_SCHEME=https"
      - "X_PROXY_NAME=####INTERNAL_HOSTNAME####"
    volumes:
      - ./data/jenkins:/var/jenkins_home
      - ./data/ssh/:/var/ssh/
      - /var/run/docker.sock:/var/run/docker.sock
      - /usr/bin/docker:/usr/bin/docker
      - ./data/volumes/lib64/libdevmapper.so.1.02:/usr/lib/libdevmapper.so.1.02
      - ./data/volumes/lib64/libdw.so.1:/usr/lib/libdw.so.1
      - ./data/volumes/lib64/libgcrypt.so.11:/usr/lib/libgcrypt.so.11
      - ./data/volumes/lib64/libsystemd-id128.so.0:/usr/lib/libsystemd-id128.so.0
      - ./data/volumes/lib64/libsystemd-journal.so.0:/usr/lib/libsystemd-journal.so.0

networks:
  web:
    external:
      name: web
  dockerhub:
    external:
      name: ####INTERNAL_HOSTNAME####

Depois de iniciar a imagem com docker-compose up -d , ela será reiniciada quando houver um problema e assim que o servidor inteiro for reiniciado.

    
por 03.12.2017 / 20:26
0

Concordo com o uso do Docker para iniciar o contêiner e usar a opção restart: always.

Quanto ao script & registro:

  • Você está substituindo os padrões do daemon do docker? Você pode querer considerar o uso de um arquivo de substituição apenas com os valores não padrão, em vez de editar os próprios arquivos de configuração do systemd.

  • Sua saída de systemctl: você já tentou configurar StandardOutput = tty para ver o que está acontecendo quando acontece?

  • Outros registros: você vê algum erro em outros registros em seu sistema, como / var / log / syslog ou / var / log / messages? Para systemd, a saída padrão para stderr é syslog.

Estou perguntando isso porque na minha experiência Unix / Linux você precisa visualizar os logs quando as ações do sistema não se somam.

Para mais informações sobre o uso do Docker com o systemd, você pode conferir este wiki .

    
por 18.12.2017 / 17:11