Uruchamianie docker-compose z systemd na Ubuntu 15.04

10

Mam projekt skomponowania dokera, który chciałbym kontrolować przez systemd. Na początku użyłbym skryptu, który wygląda następująco:

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

(powyżej dostosowane stąd )

Jednak teraz pracuję na hoście dokującym, na którym działa Ubuntu 15.04, który przeszedł na systemd. Jak mogę to zrobić jako skrypt usługi systemowej? Po prostu uruchomienie demona tworzenia dokerów nie pozwoli systemowi na śledzenie i restartowanie w przypadku awarii.

Oto co mam do tej pory:

[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
źródło

Odpowiedzi:

11

Sugeruję usunięcie -dopcji. W tym przypadku nie trzeba uruchamiać kontenerów w tle.

Kevin Rood
źródło
6

Odkryłem, że: Autor stosuje podobne podejście, jak http://trackless.ca/2015/12/21/docker-compose-meets-systemd/ . Ale dodatkowo tworzy jedną usługę systemową dla każdej usługi komponowania dokerów.

Możesz rozważyć konwersję pliku komponowania dokera do wielu plików usługi systemowej, aby pozbyć się zależności między kompozycją dokera: http://container-transform.readthedocs.org/ Zastosowałem to podejście, działa dobrze w przypadku prostych konfiguracji.

André B.
źródło
1
możesz podać dodatkowe informacje z linków w swojej odpowiedzi, linki zwykle nie działają po pewnym czasie.
Dennis Nolte
1
tak naprawdę link już nie działa ^^.
christophe31
Oto link do archiwum internetowego do pierwszego postu na blogu: web.archive.org/web/20161105135126/http://trackless.ca/2015/12/…
pdoherty926
0

Spróbuj tego, znalazłem w moim teście, uruchomienie lub zatrzymanie wymaga więcej czasu niż normalna usługa.

[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
źródło
1
myślę, że powinieneś użyć WorkingDirectory. docker-compose użyj bieżącego katalogu roboczego do załadowania plików .env WorkingDirectory = / projects / my_server również ExecStart = / usr / local / bin / docker-compose up
Mohammadalijf