如何在主进程未阻塞时保持Kubernetes pod运行?

时间:2017-09-07 14:56:50

标签: docker process kubernetes blocking postfix

我有一个postfix pod,只要我拥有整个群集,我就会继续运行。问题是"开始"命令:

postfix start

是非阻塞的,这意味着它会在成功触发命令后立即退出。据我所知,这是启动postfix的唯一方法。

Docker的工作方式是,一旦主进程退出,它就会退出容器。因此,当postfix start返回时,Docker将假设整个容器已完成并关闭它,即使此命令已触发其他进程。

如何防止这种情况发生?我能想到的唯一解决方法是postfix start && sleep infinity,但这看起来很丑陋和奇怪。如果可能的话,我想避免睡眠无限。有没有另一种方法来启动阻止阻止的后缀?

2 个答案:

答案 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 的更多信息(答案也从该链接中提取)。