如何根据 docker run args 使 Monit“检查进程”在 docker 内部有条件?

如何根据 docker run args 使 Monit“检查进程”在 docker 内部有条件?

我想让 Monit 的“检查过程”根据环境变量有条件地工作。

这是我想要实现的伪代码(不是有效的 monit 配置语法):

[ -n "$run_foo" ] && check process foo ....

我的用例:我有一个 docker 镜像,它像这样启动 monit 进程:

CMD ["/bin/monit", "-c","/config/monit.conf"]

然后 Monit 启动各种守护进程。

现在,我希望能够在运行时告诉我要在从此映像创建的特定容器中启动哪些守护进程,如下所示:

docker run --env="run_foo=1;run_bar=1" ...

我知道 monit unmonitor 和类似的参数,但是我认为它们不能满足我的目的。

想过这样的事情:

start program="/bin/bash -c '[ -n \"$run_foo\" ] && /bin/foo .."

但是,似乎它会导致 monit 不断旋转,尝试启动和监视不应该启动的事物。

我知道可以使用不同的 monit 配置文件,或者使用不同的 docker 镜像 - 但这些都不能作为答案。

感谢其他想法。

答案1

遗憾的是,Monit 的工作方式并非如此。

Monit 在那里反应到您定义的状态。如果您将其用作初始化系统(完全正常且正常工作),则必须有一个根据您的需要构建的配置文件。

然而,你可以尝试用一点点sed东西来破解它。

这个想法是拥有monitrc所有配置,但所有配置都处于非活动状态,并在首次启动时激活它们。例如:

#check process foo with pidfile /run/foo.pid # proc-foo
#  onreboot nostart # proc-foo
#  mode passive # proc-foo

#check process bar with pidfile /run/bar.pid # proc-bar
#  onreboot nostart # proc-bar
#  mode passive # proc-bar

check program firststart path "/bin/bash -c /tmp/firststart.sh" # first-start

虽然/tmp/firststart.sh是这样的:

#!/usr/bin/env bash

# Uncomment Lines Per Config:
[[ -n "${run_foo}" ]] && sed -i 's/^#\(.*\) # proc-foo$/\1/' /etc/monitrc
[[ -n "${run_bar}" ]] && sed -i 's/^#\(.*\) # proc-bar$/\1/' /etc/monitrc

# Delete FirstStart Line
sed -i '/^.*# first-start$/d' /etc/monitrc

# Force reload of monit config
kill -SIGHUP $(cat /run/monit.pid)

相关内容