6
4

2 回答 2

2

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

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

如果您不希望您的流程管理器轮询 docker,您可以改为运行 watch 的东西docker events

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

我希望这有助于或帮助另一位runit大师提供更详细的建议。

于 2014-01-18T01:33:43.027 回答
0

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

例如,使用 docker,您可能希望运行脚本如下所示:

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

使用execandchpst应该可以解决当您关闭 runit 服务时进程未正确终止的大多数问题。

于 2018-07-27T19:20:37.107 回答