首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何获得一个新启动的脚本来正确地管理运行一个码头映像?

如何获得一个新启动的脚本来正确地管理运行一个码头映像?
EN

Stack Overflow用户
提问于 2014-06-01 17:47:39
回答 4查看 6.5K关注 0票数 12

我有一个本地码头注册中心,我想用新贵来管理.

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

代码语言:javascript
复制
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

我可以从以下几个方面开始我的码头注册:

代码语言:javascript
复制
sudo start docker-registry

响应:docker-注册表启动/运行,进程8620

检查以确认它的运行情况?

代码语言:javascript
复制
sudo status docker-registry

响应:docker-注册表启动/运行,进程8620

试图用以下方式来阻止它:

代码语言:javascript
复制
sudo stop docker-registry

回应:码头-登记站/等候

然而,实际上并没有停止。该进程仍然处于活动状态,容器正在运行,而且它仍然完美地运行着

它确实完美无缺地结束了:

代码语言:javascript
复制
docker stop docker-registry

我尝试过将其添加到新启动脚本中:

代码语言:javascript
复制
post-stop script
    docker stop docker-registry
end script

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

EN

回答 4

Stack Overflow用户

发布于 2014-11-24 15:56:28

这对我起了作用:

代码语言:javascript
复制
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

我假设正式的码头医生只关心自动启动部分。upstart的实际PID输出与实际的码头进程PID不同,我怀疑这在停止时会导致某些不匹配:

代码语言:javascript
复制
sudo service foo-docker start
foo-docker start/running, process 30313

这个过程是什么?看起来这就是Docker启动集装箱的方式:

代码语言:javascript
复制
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是不同的:

代码语言:javascript
复制
pidof foo
30400

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

代码语言:javascript
复制
sudo kill 30386 # or sudo service foo-docker stop
#30400 is still running
票数 8
EN

Stack Overflow用户

发布于 2014-12-15 01:40:46

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

例如,我有以下内容:

代码语言:javascript
复制
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也很荣幸)。

在Ubuntu14.04上的Docker version 1.4.0, build 4595d4f上进行测试。

如果不起作用,请考虑更新以使用上游码头apt回购:

代码语言:javascript
复制
   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
票数 3
EN

Stack Overflow用户

发布于 2014-06-14 04:33:54

不需要在这里调用停靠停止,Upstart的停止命令将向容器发送SIGTERM信号,这是相同的事情。

让--rm在这里工作可能有问题。关于这件事,吉特布有个公开的话题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23982672

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档