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

Ger*_*rat 12 upstart docker

我有一个本地的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
Run Code Online (Sandbox Code Playgroud)

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

sudo start docker-registry
Run Code Online (Sandbox Code Playgroud)

响应:docker-registry启动/运行,进程8620

检查确认其运行?

sudo status docker-registry
Run Code Online (Sandbox Code Playgroud)

响应:docker-registry启动/运行,进程8620

试图阻止它:

sudo stop docker-registry
Run Code Online (Sandbox Code Playgroud)

响应:docker-registry停止/等待

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


它完全停止:

docker stop docker-registry
Run Code Online (Sandbox Code Playgroud)

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

post-stop script
    docker stop docker-registry
end script
Run Code Online (Sandbox Code Playgroud)

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

Tho*_*sen 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
Run Code Online (Sandbox Code Playgroud)

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

sudo service foo-docker start
foo-docker start/running, process 30313
Run Code Online (Sandbox Code Playgroud)

这个过程是什么?看起来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
Run Code Online (Sandbox Code Playgroud)

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

pidof foo
30400
Run Code Online (Sandbox Code Playgroud)

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

sudo kill 30386 # or sudo service foo-docker stop
#30400 is still running
Run Code Online (Sandbox Code Playgroud)


cpu*_*y83 0

不需要在这里调用 docker stop Upstart 的 stop 命令会向容器发送 SIGTERM 信号,这是同样的事情。

不过,让 --rm 在这里工作可能会出现问题。Github 上有一个关于它的开放问题