我在Docker容器中运行已部署的应用程序,实际上,它是一个永远运行的websocket客户端。每次部署我都会使用docker run
中设置的命令重建容器并使用Dockerfile
启动容器。
现在,我已经注意到有几次该过程偶尔会在没有重新启动的情况下死亡。运行docker ps
时,我可以看到容器已启动,并且已经运行了2周,但是在其中运行的进程已经死亡而主机没有任何更明智的
我是否需要在docker容器内部建立一个流程管理器来管理容器化流程?
编辑:
Dockerfile:https://github.com/DVG/catpen-edi/blob/master/Dockerfile
答案 0 :(得分:3)
我们已经开发了一个为Docker容器量身定制的流程管理器,并且已经使用它取得了相当大的成功,可以完全解决您描述的问题。最好的起点是take a look at chaperone-docker on github。第一页上的自述文件包含一个指向最小基本图像的快速链接以及一个完全配置的LAMP堆栈,因此您可以尝试一下,看看完整配置的图像是什么样的。它是开源的,完整记录。
答案 1 :(得分:1)
这是一个非常有趣的问题,与PID1相关,以及docker用CMD
或ENTRYPOINT
中指定的命令替换PID1。发生的事情是,如果父进程死亡并且它变成了一个孤儿,子进程不会被任何东西自动采用(因为在你习惯的传统init系统中没有PID1)。 Here is some excellent reading给你一些想法。您可能会从他们的简化初始化系统(“my_app”)附带的baseimage-docker
图像中获得一些里程数,这将为您解决一些问题。但是,我强烈提醒你不要自动采用所有容器的Phusion思维模式,因为在那个空间中存在一些意识形态的摩擦。我不记得有关Docker的Github关于潜在的最小init系统解决这个问题的讨论,但我无法想象这将永远是一个问题。祝你好运!
答案 2 :(得分:0)
如果你有两个红宝石过程,听起来孩子还没有退出,应用程序刚刚停止工作。 EventMachine反应堆很可能就在后台。
EDI应用确实需要spawn the additional Ruby process吗?这只会在Docker和您的应用之间添加另一个图层。使用CMD [ "ruby", "boot.rb" ]
直接运行服务器。如果您发现单个流程仍然会出现问题,那么您需要找到导致应用挂起的原因。
当进程正在运行时,PID 1为docker,它也需要handle the SIGINT
and SIGTERM
个信号。
# Trap ^C
Signal.trap("INT") {
shut_down
exit
}
# Trap `Kill `
Signal.trap("TERM") {
shut_down
exit
}
当容器实际死亡时,Docker也有restart policies。
docker run --restart=always
no
退出时不要自动重启容器。这是 默认。on-failure[:max-retries]
仅在容器时重新启动 以非零退出状态退出。可选地,限制数量 重新启动重试Docker守护程序尝试。always
总是重启 容器无论退出状态如何。当你总是指定时, Docker守护程序将尝试无限期地重新启动容器。该 容器也将始终在守护进程启动时启动,无论如何 容器的当前状态。unless-stopped
总是重启 容器,无论退出状态如何,但不要在守护程序上启动它 如果容器之前已经处于停止状态,则启动。