Inicio de docker-compose con systemd en ubuntu 15.04

10

Tengo un proyecto docker-compose que me gustaría controlar a través de systemd. En el inicio, usaría un script que se ve así:

description "Start/Stop server"
author "Jim Cortez"

start on filesystem and started docker
stop on runlevel [!2345]

respawn limit 3 240

pre-start script
    # wait (if necessary) for our docker context to be accessible
    while [ ! -f /projects/my_server/docker-compose.yml ]
    do
      sleep 1
    done
    /usr/local/bin/docker-compose -f /projects/my_server/docker-compose.yml up -d
end script

script
    sleepWhileAppIsUp(){
        while docker ps | grep "$1" >/dev/null; do
            sleep 2
        done
    }

    sleepWhileAppIsUp "my_server"
end script

# stop docker container after the stop event has completed
post-stop script
    if docker ps | grep my_server;
    then
        /usr/local/bin/docker-compose -f /projects/my_server/docker-compose.yml stop
    fi
end script

(arriba adaptado de aquí )

Sin embargo, ahora estoy ejecutando en un host docker que ejecuta Ubuntu 15.04, que ha cambiado a systemd. ¿Cómo puedo hacer lo anterior como un script de servicio systemd? Simplemente iniciar el daemon docker-compose no permitirá que systemd rastree y reinicie en caso de falla.

Esto es lo que tengo hasta ahora:

[Unit]
Description=My Server container
Requires=docker.service
After=docker.service

[Service]
Restart=always
ExecStart=/usr/local/bin/docker-compose -f /projects/my_server/docker-compose.yml up -d
ExecStop=/usr/local/bin/docker-compose -f /projects/my_server/docker-compose.yml stop

[Install]
WantedBy=local.target
Jim Cortez
fuente

Respuestas:

11

Sugiero eliminar la -dopción. No necesita ejecutar los contenedores en segundo plano en este caso.

Kevin Rood
fuente
6

Descubrí que: El autor utiliza un enfoque similar al que usted http://trackless.ca/2015/12/21/docker-compose-meets-systemd/ . Pero además, crea un servicio systemd para cada servicio docker-compose.

Puede considerar convertir su archivo docker-compose a múltiples archivos de servicio systemd para deshacerse de la dependencia docker-compose: http://container-transform.readthedocs.org/ Utilicé ese enfoque, funciona bien para configuraciones simples.

André B.
fuente
1
es posible que desee poner información adicional de los enlaces en su respuesta, los enlaces tienden a no funcionar después de un tiempo.
Dennis Nolte
1
de hecho, el enlace ya no funciona ^^.
christophe31
Aquí hay un enlace de Internet Archive a la primera publicación del blog: web.archive.org/web/20161105135126/http://trackless.ca/2015/12/…
pdoherty926
0

Intente esto, descubrí en mi prueba, que requiere más tiempo que el servicio normal para comenzar o detenerse.

[Unit]
Description=My Server container
Requires=docker.service
After=network.target docker.service

[Service]
#Restart=always
Type=simple
WorkingDirectory=/projects/my_server
ExecStart=/usr/local/bin/docker-compose -f /projects/my_server/docker-compose.yml up
ExecStop=/usr/local/bin/docker-compose -f /projects/my_server/docker-compose.yml down

[Install]
WantedBy=multi-user.target
Daniel YC Lin
fuente
1
Creo que deberías usar WorkingDirectory. docker-compose usa el directorio de trabajo actual para cargar archivos .env WorkingDirectory = / projects / my_server también ExecStart = / usr / local / bin / docker-compose up
Mohammadalijf