Arranque automático de contenedores Docker con Systemd

Es interesante personalizar un poco ciertas cosas, por ejemplo debemos establecer una estrategia en la configuración de forma que al reiniciar el servidor todo arranque normalmente o que en caso de fallo la web vuelva a funcionar.

Contenedores con systemd sin fallos (Ghost en este caso)

Bueno he de decir que es relativamente complicado ya que systemd gestiona las señales de salida y demás de manera un poco rara con respecto a docker. Da problemas, pero tiene remedio gracias a que los contenedores persisten aunque reinicies el servidor.

Para que funcione lo primero es arrancar el contenedor normalmente pero dando un nombre:

$ docker run -d -p 2368:2368 -v /path/to/ghost:/var/lib/ghost --name myghost ghost

Y después creamos un fichero como podría ser /etc/systemd/system/docker-myghost.service con el siguiente contenido:

Description=Ghost Service  
Alias=myghost.service  
Requires=docker.service  
After=docker.service

[Service]
Restart=always  
ExecStart=/usr/bin/docker start -a myghost  
ExecStop=/usr/bin/docker stop -t 2 myghost

[Install]
WantedBy=multi-user.target  

Ahora solo queda hacer un reload, habilitarlo como systemd.

$ systemctl daemon-reload
$ systemctl enable docker-myghost.service

Ahora podrás arrancar (systemctl start docker-myghost.service) y parar (systemctl stop docker-myghost.service) con systemd tú contenedor siempre y cuando no lo borres con docker rm myghost.

Conclusión

Es una real chapuza que funcionará, según la web oficial1 la clave está en el -a del docker start ya que esto añade o inicia (attach) un proceso que redirige todas las señales (stdin/stdout) y así puede gestionar correctamente cuando se para el contendor para volver a iniciarlo. Ignoro más detalles al respecto y me gustaría saber más, la verdad.