我一直在通过
运行docker进程(apps) docker run …
但在runit supervision
下( runit 就像daemontools) - 所以runit确保进程保持运行,传递信号等。
这合理吗? Docker似乎想要运行自己的妖魔化 - 但它并不像 runit 那么彻底。此外,当 runit 重新启动应用程序时 - 每次都会创建一个新容器(很好),但它会留下一个旧容器的痕迹 - 这似乎意味着我以错误的方式执行它。
泊坞客不应该这样运行吗?
我应该从图像中设置一个容器,只需一次,然后让 runit 一直运行/监督该容器吗?
答案 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 ...
使用exec
和chpst
应该可以解决大多数问题,因为在关闭Runit服务时进程无法正确终止。