Démarrer docker-compose avec systemd sur Ubuntu 15.04

10

J'ai un projet de composition de docker que je voudrais contrôler via systemd. Au début, j'utiliserais un script qui ressemble à ceci:

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

(ci-dessus adapté d' ici )

Cependant, je suis maintenant en cours d'exécution sur un hôte docker qui exécute Ubuntu 15.04, qui est passé à systemd. Comment puis-je faire ce qui précède en tant que script de service systemd? Le simple lancement du démon docker-compose ne permettra pas à systemd de suivre et de redémarrer en cas d'échec.

Voici ce que j'ai jusqu'à présent:

[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
la source

Réponses:

11

Je suggère de supprimer l' -doption. Dans ce cas, vous n'avez pas besoin d'exécuter les conteneurs en arrière-plan.

Kevin Rood
la source
6

J'ai trouvé que: l'auteur utilise une approche similaire à celle que vous http://trackless.ca/2015/12/21/docker-compose-meets-systemd/ . Mais en plus, il crée un service systemd pour chaque service docker-compose.

Vous pourriez envisager de convertir votre fichier docker-compose en plusieurs fichiers de service systemd pour vous débarrasser de la dépendance docker-compose: http://container-transform.readthedocs.org/ J'ai utilisé cette approche, cela fonctionne bien pour les configurations simples.

André B.
la source
1
vous voudrez peut-être mettre des informations supplémentaires à partir des liens dans votre réponse, les liens ont tendance à ne pas fonctionner après un certain temps.
Dennis Nolte
1
en effet, le lien ne fonctionne plus ^^.
christophe31
Voici un lien Internet Archive vers le premier article de blog: web.archive.org/web/20161105135126/http://trackless.ca/2015/12/…
pdoherty926
0

Essayez ceci, j'ai trouvé dans mon test, il faut plus de temps que le service normal pour démarrer ou arrêter.

[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
la source
1
je pense que vous devriez utiliser WorkingDirectory. docker-compose utilise le répertoire de travail actuel pour charger les fichiers .env WorkingDirectory = / projects / my_server également ExecStart = / usr / local / bin / docker-compose up
Mohammadalijf