Запуск docker-compose с помощью systemd в Ubuntu 15.04
У меня есть проект 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
3 ответа
Я предлагаю удалить -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