Docker

如何根據 docker run args 在 docker 內部使 Monit“檢查程序”有條件?

  • November 3, 2019

我想根據環境變數有條件地使 Monit 的“檢查過程”工作。

這是我想要實現的虛擬碼(不是有效的監控配置語法):

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

我的案例:我有一個 docker 鏡像,它可以像這樣啟動監控程序:

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 圖像的可能性 - 這些不符合答案。

其他想法表示讚賞。

可悲的是,這不是 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)

引用自:https://serverfault.com/questions/676227