我有一个本地的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
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
但它只是回归: 停止:停止时作业失败
答案 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 run
为exec
行添加前缀。这将导致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-openvpn
和stop 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