Starten von Docker-Compose mit systemd unter Ubuntu 15.04

10

Ich habe ein Docker-Compose-Projekt, das ich über systemd steuern möchte. Beim Start würde ich ein Skript verwenden, das so aussieht:

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

(oben von hier angepasst )

Ich laufe jetzt jedoch auf einem Docker-Host, auf dem Ubuntu 15.04 ausgeführt wird, der auf systemd umgestellt hat. Wie kann ich das oben genannte als systemd-Dienstskript ausführen? Durch einfaches Starten des Docker-Compose-Daemons kann systemd im Fehlerfall nicht nachverfolgen und neu starten.

Folgendes habe ich bisher:

[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
quelle

Antworten:

11

Ich schlage vor, die -dOption zu entfernen . In diesem Fall müssen Sie die Container nicht im Hintergrund ausführen.

Kevin Rood
quelle
6

Ich fand das: Der Autor verwendet einen ähnlichen Ansatz wie Sie http://trackless.ca/2015/12/21/docker-compose-meets-systemd/ . Zusätzlich erstellt er einen systemd-Dienst für jeden Docker-Compose-Dienst.

Sie könnten erwägen, Ihre Docker-Compose-Datei in mehrere Systemd-Dienstdateien zu konvertieren, um die Docker-Compose-Abhängigkeit zu beseitigen : http://container-transform.readthedocs.org/ Ich habe diesen Ansatz verwendet, er funktioniert gut für einfache Setups.

André B.
quelle
1
Möglicherweise möchten Sie einige zusätzliche Informationen aus den Links in Ihre Antwort einfügen. Links funktionieren in der Regel nach einiger Zeit nicht mehr.
Dennis Nolte
1
in der Tat funktioniert der Link nicht mehr ^^.
Christophe31
Hier ist ein Internetarchiv-Link zum ersten Blog-Beitrag: web.archive.org/web/20161105135126/http://trackless.ca/2015/12/…
pdoherty926
0

Versuchen Sie dies, wie ich in meinem Test festgestellt habe. Das Starten oder Stoppen des Dienstes dauert länger als der normale Dienst.

[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
quelle
1
Ich denke, Sie sollten WorkingDirectory verwenden. Docker-Compose Verwenden Sie das aktuelle Arbeitsverzeichnis, um .env-Dateien zu laden. WorkingDirectory = / projects / my_server auch ExecStart = / usr / local / bin / Docker-Compose
Mohammadalijf