我怎样才能得到一个新贵的脚本来正确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 

尝试使用execdocker 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-openvpnstop 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 

这样,图像会自动重新启动,就像新贵一样。

有关重新启动策略的更多信息