Запуск docker-compose с помощью systemd в Ubuntu 15.04

10

У меня есть проект docker-compose, которым я бы хотел управлять через systemd. В upstart я бы использовал скрипт, который выглядит следующим образом:

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

(выше адаптировано отсюда )

Однако сейчас я работаю на док-хосте, на котором работает Ubuntu 15.04, который переключился на systemd. Как я могу сделать выше, как сценарий службы systemd? Простой запуск демона docker-compose не позволит systemd отслеживать и перезапускать в случае сбоя.

Вот что у меня так далеко:

[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
Джим Кортез
источник

Ответы:

11

Я предлагаю удалить эту -dопцию. В этом случае вам не нужно запускать контейнеры в фоновом режиме.

Кевин Руд
источник
6

Я обнаружил, что: автор использует такой же подход, как и вы http://trackless.ca/2015/12/21/docker-compose-meets-systemd/ . Но дополнительно он создает один сервис systemd для каждого сервиса docker-compose.

Вы можете подумать о том, чтобы преобразовать файл docker-compose в несколько файлов службы systemd, чтобы избавиться от зависимости docker-compose: http://container-transform.readthedocs.org/ Я использовал этот подход, он отлично работает для простых установок.

Андре Б.
источник
1
Возможно, вы захотите добавить некоторую дополнительную информацию по ссылкам в вашем ответе; через некоторое время ссылки, как правило, не работают.
Деннис Нольте
1
действительно, ссылка больше не работает ^^.
christophe31
Вот ссылка Интернет-архива на первое сообщение в блоге: web.archive.org/web/20161105135126/http://trackless.ca/2015/12/…
pdoherty926
0

Попробуйте, я обнаружил в своем тесте, что для запуска или остановки требуется больше времени, чем для нормальной работы.

[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
Даниэль YC Лин
источник
1
я думаю, что вы должны использовать WorkingDirectory. docker-compose использует текущий рабочий каталог для загрузки файлов .env WorkingDirectory = / projects / my_server, а также ExecStart = / usr / local / bin / docker-compose up
Mohammadalijf