我想在Docker构建期间启动服务。我不需要这个服务在构建过程完成之后继续运行(或者我知道我可以使用CMD命令),但是我确实需要它运行足够长时间来执行第二个命令,该命令依赖于此服务并且正在运行。
更确切地说,我正在尝试为ejabberd XMPP服务器编写一个Dockerfile,它还为该服务器安装了一个模块。我正在尝试使用ejabberdctl start启动ejabberd服务器,然后使用ejabberdctl module_install实用程序安装模块,该实用程序取决于节点正在运行。它看起来像这样:
{{1}}
现在我遇到了一个问题,我想出了两个可能的原因。问题是我的构建在此行上不起作用,因为当第二个命令尝试执行时节点已关闭。我收到以下错误,这是一个典型的错误,当您尝试使用ejabberdctl实用程序时,节点实际上没有启动:
与节点ejabberd @ localhost
的RPC连接失败命令' / bin / sh -c ejabberdctl start&& ejabberdctl modules_update_specs&& ejabberdctl module_install ejabberd_auth_http'返回非零代码:3
这可能是因为服务启动需要的时间比第二个命令执行所需的时间长,因此第二个命令会运行到刚刚启动的节点。不确定这是多少。第二个原因可能是依赖于init.d的服务的启动在构建过程中在Docker中不起作用。
我构建容器,直到导致问题的那一行,进入容器并手动执行命令,一切正常。
总而言之,我想在构建期间启动ejabberd服务器,然后使用其控制实用程序来安装一些东西。最后一个选项是在没有服务器运行的情况下手动安装模块,但我更喜欢使用ejabberdctl控制实用程序。
答案 0 :(得分:0)
这些*ctl
程序通常带有一些实用程序来启动/停止/监视服务的状态。
如果你的情况我认为最好的想法是有一个简单的bash脚本,你可以在构建时运行,这样做:
看看这个:
root@158479dec020:/# ejabberdctl status Failed RPC connection to the node ejabberd@158479dec020: nodedown root@158479dec020:/# echo $? 3 root@158479dec020:/# ejabberdctl start root@158479dec020:/# echo $? 0 root@158479dec020:/# ejabberdctl status The node ejabberd@158479dec020 is started with status: started ejabberd 16.01 is running in that node root@158479dec020:/# echo $? 0 root@158479dec020:/# ejabberdctl stop root@158479dec020:/# echo $? 0 root@158479dec020:/# ejabberdctl status Failed RPC connection to the node ejabberd@158479dec020: nodedown root@158479dec020:/# echo $? 3
因此,这告诉我们如果您运行ejabberd status
并且守护程序未运行,则会收到退出代码3
,0
如果它已启动并正在运行。
你可以使用你的bash脚本:
function run() { ejabberdctl start # Repeating just in case... ejabberdctl status &>/dev/null if [ $? -eq 0 ]; then echo "Do some magic here, ejabberd is running..." exit 0 fi echo "Ejabberd still down..." } while true; do run; sleep 1; done
这就是你在CLI上得到的:
root@158479dec020:/# ./check.sh Ejabberd still down... Do some magic here, ejabberd is running... root@158479dec020:/# ejabberdctl stop root@158479dec020:/# ./check.sh Ejabberd still down... Ejabberd still down... Do some magic here, ejabberd is running...