我怎样才能得到一个新贵的脚本来正确pipe理运行一个泊坞窗图像?
我有一个本地dockerregistry,我想与新贵pipe理。
我有以下脚本(在/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
我可以开始我的dockerregistry罚款:
sudo start docker-registry
响应: dockerregistry启动/运行,过程8620
检查确认其运行?
sudo status docker-registry
响应: dockerregistry启动/运行,过程8620
试图阻止它:
sudo stop docker-registry
响应: dockerregistry停止/等待
但是,它并没有停止。 这个过程还活着,容器正在运行,并且仍然运行正常
它完全停止:
docker stop docker-registry
我试过把这个添加到新贵脚本中:
post-stop script docker stop docker-registry end script
但是它只是返回: 停止:停止时作业失败
这对我工作:
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
我假设官方的Docker文档只关心自动起始部分。 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
并杀死dockerPID,因为我猜service foo-docker stop
,并没有杀死容器(或运行在其中的命令):
sudo kill 30386 # or sudo service foo-docker stop #30400 is still running
尝试使用exec
为docker run
行添加前缀。 这将导致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
docker stop docker-openvpn
按预期工作(–rm也很荣幸)。
在Docker version 1.4.0, build 4595d4f
上testingDocker version 1.4.0, build 4595d4f
在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
不需要在这里调用docker stop Upstart的停止命令将SIGTERM信号发送到容器,这是相同的事情。
但是,在这里工作可能会遇到一些问题。 Github上有一个公开的问题
要使您的预停脚本正常工作,只需添加“rm”来清理指定的容器,如下所示:
... ... 前停脚本 / usr / bin / docker stop [容器名称] / usr / bin / docker rm [容器名称] 结束脚本
你也可以避免在这种情况下启动(如在“docker开始”VS“docker运行”)一个容器(如果你已经做了跑步和停止,只能开始工作)。 所以你的开始脚本看起来像:
... 脚本 / usr / bin / docker rm [容器名称] | 真正 / usr / bin / docker运行[-v vol:vol] [-p port:port] --name = [container name] [docker tag] 结束脚本
为此,您需要使用–name运行,或者停止找不到您的容器。 如果你真的想启动-a,你可以运行,停止,启动你的启动脚本。
完整的例子:
描述“风暴监督docker集装箱” 作者“youremail@emailprovider.domain” 启动文件系统并启动docker 在运行级别停止[!2345] 重生 脚本 / usr / bin / docker rm storm-supervisor | 真正 / 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大亨/风暴监督员 结束脚本 前停脚本 / usr / bin / docker停止storm-supervisor / usr / bin / docker rm storm-supervisor 结束脚本
你可以在启动--restart=always
-registry的时候使用--restart=always
docker run -d --restart=always docker-registry
这样,图像会自动重新启动,就像新贵一样。
有关重新启动策略的更多信息