SystemD não está executando um ExecStartPre até que eu recarregue e reinicie o serviço

7

Estou substituindo o script de inicialização /usr/lib/systemd/system/docker.service para estendê-lo com um arquivo de ambiente. Eu defini meu arquivo de configuração em /etc/systemd/system/docker.service.d/docker.conf da seguinte forma:

test -d /etc/systemd/system/docker.service.d || \
    mkdir /etc/systemd/system/docker.service.d

cat > /etc/systemd/system/docker.service.d/docker.conf <<EOF
[Service]
EnvironmentFile=/etc/sysconfig/docker
ExecStartPre=-/usr/local/sbin/generate-docker-config
ExecStart=
ExecStart=/usr/bin/docker daemon -H fd:// --dns=\${LOCAL_IPV4}
EOF

systemctl daemon-reload

Estou executando o script acima como uma etapa de compilação Packer para uma AMI.

Quando eu lanço a minha AMI, vejo a seguinte saída de status sobre o serviço Docker do SystemD:

● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
  Drop-In: /etc/systemd/system/docker.service.d
           └─docker.conf
   Active: active (running) since Mon 2016-03-28 21:16:11 UTC; 6min ago
     Docs: https://docs.docker.com
 Main PID: 858 (docker)
   CGroup: /system.slice/docker.service
           ├─ 858 /usr/bin/docker daemon -H fd:// --dns=10.224.4.178 --log-driver=syslog --log-opt tag={{.ImageName}}

Ele não executou meu ExecStartPre , como visto na saída. Se eu fizer o seguinte, eu faço ver que agora ele executou o script de inicialização:

# systemctl daemon-reload && systemctl restart docker.service && \
    systemctl status docker.service
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
  Drop-In: /etc/systemd/system/docker.service.d
           └─docker.conf
   Active: active (running) since Mon 2016-03-28 22:05:24 UTC; 24ms ago
     Docs: https://docs.docker.com
  Process: 1873 ExecStartPre=/usr/local/sbin/generate-docker-config (code=exited, status=0/SUCCESS)
 Main PID: 1876 (docker)
   CGroup: /system.slice/docker.service
           └─1876 /usr/bin/docker daemon -H fd:// --dns=10.224.4.178 --log-driver=syslog --log-opt tag={{.ImageName}}

Observe como agora tem o ExecStartPre na saída do status?

Existe um comando que eu deveria estar executando na minha compilação do Packer além de daemon-reload para fazer com que o SystemD carregue e execute o novo arquivo de configuração de serviço e ExecStartPre script? Devo apenas restart do serviço no Packer, ou existe uma solução melhor e mais personalizada para o problema?

NOTA: Meu script ExecStartPre precisa da rede disponível para curl para tags de instância do EC2. O arquivo de serviço do Docker especifica After=network.target docker.socket , por isso estou assumindo que ele será executado após o início da rede.

    
por Naftuli Kay 29.03.2016 / 00:10

2 respostas

0

Bem, esse é o comportamento esperado. Se você pretende reiniciar o serviço de encaixe logo após a substituição do arquivo da unidade de encaixe, deverá invocar systemctl restart docker.service após systemctl daemon-reload no script. Se você também quiser reiniciar o docket apenas se já estiver em execução, invoque systemctl try-restart docker.service .

A finalidade dos comandos systemctl daemon-reload é informar ao daemon systemd para recarregar toda a sua configuração, recarregar arquivos de unidades e gerar novamente a árvore de dependência de serviços. No entanto, isso não afeta nenhum outro serviço no sistema, mesmo que os arquivos da unidade sejam alterados no disco.

    
por 29.03.2016 / 01:48
0

Assumindo que a rede está "on-line" depois que network.service não é 100% confiável. É por isso que há um network-online.target .

Se você está confiando no curl e quer ter absoluta certeza de que a rede está ativa antes do início do serviço, o DNS funciona, etc., e adicioná-lo ao seu docker.conf pode ajudar ...

[Unit]
After=network-online.target

... e como você está fazendo tudo isso após a inicialização, para que o novo ExecStartPre funcione, adicione systemctl daemon-reload && systemctl restart docker.service ou systemctl stop docker.service && systemctl daemon-reload && systemctl start docker.service ao seu script de compilação do Packer. Este último é mais confiável.

Parar um serviço antes que ele seja modificado e daemon-reload seja feito garantirá que a unidade inteira seja recarregada conforme especificado. Eu posso ver no terceiro bit de saída que você forneceu que o ExecStart para docker.service não não contém os argumentos que você especificou no script de compilação do Packer. Isso é por causa do systemctl restart docker.service (versus stop, daemon-reload, & start).

    
por 08.07.2018 / 18:57

Tags