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

时间:2013-10-31 11:38:33

标签: docker runit

我一直在通过

运行docker进程(apps)

docker run …

但在runit supervision下( runit 就像daemontools) - 所以runit确保进程保持运行,传递信号等。

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

泊坞客不应该这样运行吗?

我应该从图像中设置一个容器,只需一次,然后让 runit 一直运行/监督该容器吗?

2 个答案:

答案 0 :(得分:2)

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

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

如果您不希望流程管理员轮询泊坞窗,您可以改为运行监视docker events的内容。

您可以在启动容器时获取container_id作为启动守护程序的返回值,或者您可以让Docker将其写入文件(docker run -cidfile myfilename,如PID文件)

我希望帮助或帮助其他runit大师提供更详细的建议。

答案 1 :(得分:0)

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

例如,对于docker,您可能希望您的运行脚本看起来像这样:

#!/bin/bash -e
exec 2>&1
exec chpst -u dockeruser docker run -a stdin -a stdout -i ...

使用execchpst应该可以解决大多数问题,因为在关闭Runit服务时进程无法正确终止。