在Ubuntu 15.04上使用systemd启动docker-compose


10

我有一个想通过systemd控制的docker-compose项目。在暴发户中,我将使用如下所示的脚本:

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的docker主机上运行,​​该主机已切换到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

Answers:


11

我建议删除该-d选项。在这种情况下,您不需要在后台运行容器。


6

我发现:作者使用与您类似的方法http://trackless.ca/2015/12/21/docker-compose-meets-systemd/。但除此之外,他还为每个docker-compose服务创建了一个systemd服务。

您可能会考虑将docker-compose文件转换为多个systemd服务文件,以摆脱docker-compose依赖关系:http : //container-transform.readthedocs.org/ 我使用了这种方法,它对于简单的设置非常有效。


1
您可能需要在答案中添加链接中的一些其他信息,但一段时间后,链接往往无法正常工作。
丹尼斯·诺尔特

1
确实,该链接不再起作用^^。
christophe31,2013年

这是第一个博客文章的Internet存档链接: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

1
我认为您应该使用WorkingDirectory。docker-compose使用当前工作目录加载.env文件WorkingDirectory = / projects / my_server以及ExecStart = / usr / local / bin / docker-compose up
Mohammadalijf
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.