Назад | Перейти на главную страницу

Запуск docker-compose с systemd в ubuntu 15.04

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

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

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

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

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

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

[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