Estou executando vários contêineres docker no meu servidor Ubuntu. Eles são controlados pelo systemd.
Se eu executar systemctl stop [email protected]
o container desliga normalmente. A saída de journalctl é a seguinte (saída em tempo reverso, mais recente no topo):
Nov 05 10:58:11 ubox0 systemd[1]: Stopped Docker container startup for mw/salcom/app.
Nov 05 10:58:11 ubox0 docker[3622]: mw-salcom-app
Nov 05 10:58:09 ubox0 docker[3470]: [Thu Nov 05 10:58:09.921033 2020] [mpm_prefork:notice] [pid 1] AH00169: caught SIGTERM, shutting down
Nov 05 10:58:09 ubox0 systemd[1]: Stopping Docker container startup for mw/salcom/app...
Se eu, no entanto, executar shutdown -h now
, recebo:
Nov 05 10:51:04 ubox0 systemd[1]: Stopped Docker container startup for mw/salcom/app.
Nov 05 10:51:04 ubox0 systemd[1]: [email protected]: Failed with result 'timeout'.
Nov 05 10:51:04 ubox0 systemd[1]: [email protected]: Main process exited, code=killed, status=9/KILL
Nov 05 10:51:04 ubox0 systemd[1]: [email protected]: Killing process 2077 (docker) with signal SIGKILL.
Nov 05 10:51:04 ubox0 systemd[1]: [email protected]: State 'stop-sigterm' timed out. Killing.
Nov 05 10:50:04 ubox0 systemd[1]: [email protected]: Stopping timed out. Terminating.
Nov 05 10:49:04 ubox0 systemd[1]: Stopping Docker container startup for mw/salcom/app...
O contêiner não é interrompido e o processo eventualmente expira após 2 minutos e o contêiner é abortado.
Qual é a razão para isto?
Eu gostaria que meus contêineres fossem desligados normalmente para que os serviços executados neles fossem interrompidos sem perda de dados.
Meu arquivo de serviço é:
[Unit]
Description=Docker container startup for %I
Requires=docker.service
After=docker.service
[Service]
TimeoutStartSec=40
Restart=always
# wait a while before restarting in case we are doing a restore;
# this includes a 'docker stop' command after we restore the data
RestartSec=60
ExecStartPre=-/usr/bin/docker stop %i
ExecStart=/usr/bin/docker start -a %i
ExecStop=/usr/bin/docker stop %i
TimeoutStopSec=60
[Install]
WantedBy=multi-user.target
Atualização Depois de pesquisar mais, encontrei essa postagem Como lidar adequadamente com um contêiner do Docker como um serviço do systemd? descreve o mesmo problema, mas não há resposta lá.