El apagado no puede cerrar el contenedor acoplable (systemd)

El apagado no puede cerrar el contenedor acoplable (systemd)

Estoy ejecutando varios contenedores acoplables en mi servidor Ubuntu. Están controlados por systemd.

Si ejecuto el contenedor se cierra correctamente. La salida de journalctl es la siguiente (salida en tiempo inverso, la más nueva en la parte superior):systemctl stop [email protected]

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...

Sin embargo, si ejecuto shutdown -h now, obtengo:

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...

El contenedor no se detiene y el proceso finalmente se agota después de 2 minutos y el contenedor se cancela.

¿Cuál es la razón para esto?

Me gustaría que mis contenedores se cerraran correctamente para que los servicios que se ejecutan en ellos se detuvieran sin pérdida de datos.

Mi archivo de servicio es:

[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

ActualizarDespués de buscar más, encontré esa publicación.¿Cómo manejar correctamente un contenedor Docker como servicio systemd?describe el mismo problema, pero no hay respuesta allí.

Respuesta1

Parece que Docker y Systemd no siempre se llevan muy bien, consulta:

Tengo exactamente la misma configuración en una máquina diferente (mi servidor de respaldo) y aquí todo funciona bien. Puedo ejecutar el comando de apagado y todos los contenedores acoplables se cierran correctamente.

Entonces el problema podría ser un problema de dependencia. Tal vez systemd haya cerrado algún servicio que necesitan los contenedores acoplables para que puedan cerrarse correctamente.

La versión de Docker en el sistema que "falla" es 18.09.2, en el sistema que "funciona" es 18.06.1-ce.

ElNotas de lanzamientopara 18.09el estado de la versión de Docker:

In Docker versions prior to 18.09, containerd was managed
by the Docker engine daemon. In Docker Engine 18.09, 
containerd is managed by systemd.

Cuando agregué las siguientes líneas a los archivos de mi unidad:

[Unit]
...
Requires=containerd.service
After=containerd.service

y recargué los archivos de la unidad ( systemctl daemon-reload), las cosas comenzaron a funcionar nuevamente. Mis contenedores no se cerraron después del tiempo de espera de 1 minuto que configuré, sino que se cerraron después de unos segundos.

Primero intenté actualizar Docker a la versión 20.10.1, pero fue en vano.

Se me ocurrió la idea de esta 'solución' cuando encontré:https://github.com/sous-chefs/docker/issues/1062

información relacionada