在Docker构建期间启动服务

时间:2017-04-13 12:17:20

标签: docker dockerfile ejabberd docker-build

我想在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控制实用程序。

1 个答案:

答案 0 :(得分:0)

这些*ctl程序通常带有一些实用程序来启动/停止/监视服务的状态。

如果你的情况我认为最好的想法是有一个简单的bash脚本,你可以在构建时运行,这样做:

  • 启动ejabberd
  • 定期监控状态
  • 如果进程状态为up,请运行命令

看看这个:

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并且守护程序未运行,则会收到退出代码30如果它已启动并正在运行。

你可以使用你的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...