如何获得一个upstart脚本来正确管理运行docker镜像?

时间:2014-06-01 17:47:40

标签: docker upstart

我有一个本地的docker-registry,我想用upstart进行管理。

我有以下脚本(在 /etc/init/docker-registry.conf 中):

description "docker registry" 
author "me" 
start on filesystem and started docker 
stop on runlevel [!2345] 
respawn 
script
    /usr/bin/docker.io run -a stdout --rm --name=docker-registry \
    -v /var/local/docker-registry:/var/local/docker-registry \
    -p 5000:5000 mysite:5000/docker-registry
end script

我可以通过以下方式启动我的docker注册表:

sudo start docker-registry

响应: docker-registry开始/运行,进程8620

检查确认其正在运行?

sudo status docker-registry

响应: docker-registry开始/运行,进程8620

试图通过以下方式阻止它:

sudo stop docker-registry

回复: docker-registry stop / waiting

然而,它实际上并没有停止。该过程仍然存在,容器正在运行,并且它仍然可以正常运行


完全停止:

docker stop docker-registry

我尝试将其添加到upstart脚本中:

post-stop script
    docker stop docker-registry
end script

但它只是回归: 停止:停止时作业失败

5 个答案:

答案 0 :(得分:8)

这对我有用:

description "container foo"
author "me"
start on filesystem and started docker
stop on runlevel [!2345]
respawn
script
  /usr/bin/docker start -a foo
end script
pre-stop script
  /usr/bin/docker stop foo
end script

我假设the official Docker docs只关心自动启动部分。 upstart的实际PID输出与实际的docker进程PID不同,我怀疑这会在停止时导致一些不匹配:

sudo service foo-docker start
foo-docker start/running, process 30313

这个过程是什么?看起来这就是Docker推出容器的方式:

ps -p 30386 -f
UID        PID  PPID  C STIME TTY          TIME CMD
root     30386     1  0 14:48 ?        00:00:00 /bin/sh -e -c /usr/bin/docker start -a foo  /bin/sh

在容器内运行的实际命令的PID是不同的:

pidof foo
30400

杀死docker PID,正如我猜service foo-docker stop所做的那样,不会杀死容器(或在其中运行的命令):

sudo kill 30386 # or sudo service foo-docker stop
#30400 is still running

答案 1 :(得分:3)

尝试使用docker runexec行添加前缀。这将导致docker容器在shell脚本的上下文中运行,而不是shell分支它。因此,docker run二进制文件将接收信号并自行清理。

例如,我有以下内容:

description "Docker container for OpenVPN server"
start on filesystem and started docker
stop on runlevel [!2345]
respawn
script
  exec docker run --volumes-from ovpn-data --rm -p 1194:1194/udp --cap-add=NET_ADMIN kylemanna/openvpn
end script

正在运行start docker-openvpnstop docker-openvpn按预期工作(-rm也很受尊重)。

在Ubuntu 14.04上的Docker version 1.4.0, build 4595d4f上进行了测试。

如果不起作用,请考虑更新以使用上游docker apt repo:

   curl https://get.docker.io/gpg | sudo apt-key add -
   echo deb http://get.docker.io/ubuntu docker main | sudo tee /etc/apt/sources.list.d/docker.list
sudo apt-get update && sudo apt-get install -y lxc-docker

答案 2 :(得分:0)

无需致电泊坞停在这里 Upstart的stop命令会将SIGTERM信号发送到容器,这是同样的事情。

但是让--rm在这里工作可能会有问题。 Github上有一个未解决的问题

答案 3 :(得分:0)

要使您的预停止脚本正常工作,只需添加" rm"清理命名容器,所以:

...
...
pre-stop script
  /usr/bin/docker stop [container name]
  /usr/bin/docker rm   [container name]
end script

你也可以避免在这种情况下开始(如#34; docker start" vs" docker run")容器(只有在你已经运行时才能启动)并停止)。所以你的开始脚本如下:

...
script
   /usr/bin/docker rm [container name] | true
   /usr/bin/docker run [-v vol:vol] [-p port:port] --name=[container name] [docker tag]
end script

要使其正常工作,您需要使用--name运行,或者停止无法找到您的容器。如果你真的想要启动-a,你可以在启动脚本中运行,停止和启动。

完整示例:

description "storm supervisor docker container"
author "youremail@emailprovider.domain"

start on filesystem and started docker
stop on runlevel [!2345]
respawn
script
        /usr/bin/docker rm storm-supervisor | true
        /usr/bin/docker run --name="storm-supervisor" -v /var/log/docker-storm-supervisor:/var/log -p 6700:6700 -p 6701:6701  -p 6702:6702 -p 6703:6703 -p 6704:6704 -p 6705:6705 -p 6706:6706 tycoon/storm-supervisor
end script

pre-stop script
        /usr/bin/docker stop storm-supervisor
        /usr/bin/docker rm storm-supervisor
end script

答案 4 :(得分:-1)

启动docker-registry时可以使用--restart=always,即

docker run -d --restart=always docker-registry

这样,图像会在重启时自动重启,就像暴发户一样。

有关重启政策的更多信息here