我有一个postfix pod,只要我拥有整个群集,我就会继续运行。问题是"开始"命令:
postfix start
是非阻塞的,这意味着它会在成功触发命令后立即退出。据我所知,这是启动postfix的唯一方法。
Docker的工作方式是,一旦主进程退出,它就会退出容器。因此,当postfix start
返回时,Docker将假设整个容器已完成并关闭它,即使此命令已触发其他进程。
如何防止这种情况发生?我能想到的唯一解决方法是postfix start && sleep infinity
,但这看起来很丑陋和奇怪。如果可能的话,我想避免睡眠无限。有没有另一种方法来启动阻止阻止的后缀?
答案 0 :(得分:0)
您需要使用自定义CMD脚本,该脚本在postfix start
命令后保持前景。
例如,你可以使用这个,取自here:
#!/bin/bash
# Wait before postfix is really started.
function get_state {
echo $(script -c 'postfix status' | grep postfix/postfix-script)
}
postfix start
echo $(get_state)
while true; do
state=$(get_state)
if [[ "$state" != "${state/is running/}" ]]; then
PID=${state//[^0-9]/}
if [[ -z $PID ]]; then
continue
fi
if [[ ! -d "/proc/$PID" ]]; then
echo "Postfix proces $PID does not exist."
break
fi
else
echo "Postfix is not running."
break
fi
done
此脚本一直运行while循环,直到后缀进程启动,并在进程退出时退出。这样,如果postfix因任何原因死亡,您的容器就会正确停止。
答案 1 :(得分:0)
从 Postfix 3.3 (2018) 开始,您可以在前台运行 postfix(阻塞)。您可以使用命令:
postfix startfg
有关 dockerizing postfix here 的更多信息(答案也从该链接中提取)。