在runit/daemontools监督下运行docker进程是否合理

在runit/daemontools监督下运行docker进程是否合理,docker,runit,Docker,Runit,我一直在通过运行docker进程(应用程序) docker运行… 但是在运行IT监督下(运行IT就像daemontools)——因此运行IT确保进程保持正常运行,传递信号等 这合理吗?Docker似乎想进行自己的妖魔化——但并不像runit那样彻底。此外,当runit重新启动应用程序时——每次都会创建一个新的容器(很好),但它会留下旧容器的痕迹——这似乎意味着我用了错误的方法 docker不应该这样运行吗 我是否应该从映像中设置一个容器,只设置一次,然后让runit始终运行/管理该容器 Dock

我一直在通过运行docker进程(应用程序)

docker运行…

但是在
运行IT监督下(运行IT就像daemontools)——因此运行IT确保进程保持正常运行,传递信号等

这合理吗?Docker似乎想进行自己的妖魔化——但并不像runit那样彻底。此外,当runit重新启动应用程序时——每次都会创建一个新的容器(很好),但它会留下旧容器的痕迹——这似乎意味着我用了错误的方法

docker不应该这样运行吗


我是否应该从映像中设置一个容器,只设置一次,然后让runit始终运行/管理该容器

Docker确实会对守护容器进行一些管理:如果系统关闭,那么当Docker守护程序启动时,它还会重新启动系统关闭时正在运行的所有容器。但是,如果容器自己退出,或者内核(或用户)在容器运行时杀死容器,Docker守护进程将不会重新启动它。在需要重新启动的情况下,流程管理器是有意义的

我不知道
runit
,所以我不能给出具体的配置指导。但是您可能应该让process manager与docker守护进程通信,并检查给定的容器id是否正在运行(
docker ps | grep container_id
或等效的,或者直接使用docker Remote API)。如果容器已停止,请使用Docker重新启动它(
Docker run container\u id
),而不是运行新容器。或者,如果您每次都想要一个新的容器,那么从
docker run-rm
开始,在它退出或停止时自动清理它

如果您不希望流程管理器轮询docker,您可以运行监视
docker事件的程序

您可以在启动容器时获取容器id作为启动守护程序的返回值,也可以要求Docker将其写入文件(
Docker run-cidfile myfilename
,类似于PID文件)


我希望这能帮助或帮助另一位
runit
guru提供更详细的建议。

是的,我认为在runit下运行docker是有意义的。通常,当您启动一个进程时,有一种方法可以告诉它如果默认情况下启动了,就不要进行后台监控,因为从runit
run
脚本切换到进程的正常方法是通过
run
脚本最后一行的
exec
。对于docker,这意味着确保不设置
-d
标志

例如,对于docker,您可能希望您的运行脚本如下所示:

#!/bin/bash -e
exec 2>&1
exec chpst -u dockeruser docker run -a stdin -a stdout -i ...
使用
exec
chpst
可以解决关闭运行IT服务时进程未正确终止的大多数问题