在Docker构建期间启动服务
我想在Docker构建期间启动服务。我不需要这个服务在构建过程完成后继续运行(或者我知道我可以使用CMD命令),但是我需要它运行足够长的时间来执行第二个命令,该命令依赖于这个服务的启动和运行 更准确地说,我正在尝试为ejabberd XMPP服务器编写Dockerfile,它还为该服务器安装了一个模块。我正在尝试使用ejabberdctl start启动ejabberd服务器,然后使用ejabberdctl module_安装实用程序安装模块,这取决于节点是否正在启动和运行。看起来是这样的:在Docker构建期间启动服务,docker,dockerfile,ejabberd,docker-build,Docker,Dockerfile,Ejabberd,Docker Build,我想在Docker构建期间启动服务。我不需要这个服务在构建过程完成后继续运行(或者我知道我可以使用CMD命令),但是我需要它运行足够长的时间来执行第二个命令,该命令依赖于这个服务的启动和运行 更准确地说,我正在尝试为ejabberd XMPP服务器编写Dockerfile,它还为该服务器安装了一个模块。我正在尝试使用ejabberdctl start启动ejabberd服务器,然后使用ejabberdctl module_安装实用程序安装模块,这取决于节点是否正在启动和运行。看起来是这样的: R
RUN ejabberdctl start && ejabberdctl modules_update_specs && ejabberdctl module_install ejabberd_auth_http
现在我遇到了一个问题,我提出了两个可能的原因。问题是,从这一行开始,我的构建就无法工作,因为当第二个命令尝试执行时,节点已关闭。我得到以下错误,这是在节点未实际启动的情况下尝试使用ejabberdctl实用程序时的典型错误:
到节点的RPC连接失败ejabberd@localhost
命令“/bin/sh-c ejabberdctl start&&ejabberdctl modules_update_specs&&ejabberdctl module_install ejabberd_auth_http”返回了一个非零代码:3
这可能是因为启动服务所需的时间比执行第二个命令所需的时间稍长,因此第二个命令会运行到刚刚启动的节点中。不确定这有多大可能。第二个原因可能是依赖于init.d的服务的启动在构建过程中无法在Docker中工作
我构建容器,直到出现问题的那一行,输入容器并手动执行命令,一切都正常工作
总之,我想在构建过程中启动ejabberd服务器,然后使用其控制实用程序安装一些东西。最后一个选项是在服务器不运行的情况下手动安装模块,但是我更喜欢使用ejabberdctl控制实用程序进行安装。这些
*ctl
程序通常附带一些实用程序来启动/停止/监控服务状态
如果您的情况是这样的,我认为最好的办法是使用一个简单的bash脚本,您可以在构建时运行该脚本:
- 启动ejabberd
- 每隔一段时间监控状态
- 如果进程的状态为“启动”,请运行命令
你为什么不通过简单地增加睡眠来检验你的假设呢?i、 e
ejabberdctl start&&sleep 10&&ejabberdctl modules\u update\u specs&&ejabberdctl modules\u安装ejabberd\u auth\u http
?您只需在ejabberdctl start
上写一行代码,看看它是否失败,就可以测试第二个假设。带有sleep 10
的第一个版本成功了!模块安装成功,因此实际上是时间问题。有没有比睡觉更好的方法来解决这个问题?我看到了一些外部shellscript的解决方案,它在服务启动后运行,并在循环中运行,直到它在进程列表中找到进程。我不知道这是否有点过分。。
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...