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

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

我有一个 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 的 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

答案1

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

答案2

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

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

答案3

试试这个,我在测试中发现,它比正常服务需要更多的时间来启动或停止。

[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

相关内容