我想在Docker构建期间启动服务。在构建过程一定完成之后,我不需要该服务继续运行(或者我知道我可以使用CMD命令),但是我确实需要运行足够长的时间来执行第二条命令,而该命令依赖于此服务的启动并运行。
更确切地说,我正在尝试为ejabberd XMPP服务器编写一个Dockerfile,该文件也为此服务器安装了一个模块。我正在尝试使用ejabberdctl start启动ejabberd服务器,然后使用ejabberdctl module_install实用程序安装模块,这取决于正在运行的节点。看起来像这样:
RUN ejabberdctl start && ejabberdctl modules_update_specs && ejabberdctl module_install ejabberd_auth_http
现在,我遇到了一个问题,并提出了两个可能的原因。问题是我的构建无法从此行开始工作,因为当第二条命令试图执行时,该节点已关闭。我收到以下错误,这是您尝试使用ejabberdctl实用程序时的典型错误,而实际上节点未启动:这可能是因为该服务的启动花费的时间比第二条命令执行所花费的时间长,因此第二条命令遇到了刚启动的节点。不知道这有多大可能。第二个原因可能是依赖于init.d的服务启动在构建过程中在Docker中不起作用。
我建立容器,直到引起问题的那一行,进入容器并手动执行命令,一切都按预期进行。
因此,总而言之,我想在构建过程中启动ejabberd服务器,然后使用其控制实用程序安装一些东西。最后一个选择是在不运行服务器的情况下手动安装模块,但是我更喜欢使用ejabberdctl控制实用程序来进行安装。
最佳答案
这些*ctl
程序通常带有一些实用程序,用于启动/停止/监视服务状态。
如果您认为我的情况最好,那么最好有一个简单的bash脚本,您可以在构建时运行该脚本,以执行以下操作:
看这个:
root @ 158479dec020:/#ejabberdctl状态
到节点ejabberd @ 158479dec020的RPC连接失败:nodedown
root @ 158479dec020:/#回显$?
3
root @ 158479dec020:/#ejabberdctl开始
root @ 158479dec020:/#回显$?
0
root @ 158479dec020:/#ejabberdctl状态
节点ejabberd @ 158479dec020的启动状态为:已启动
ejabberd 16.01在该节点上运行
root @ 158479dec020:/#回显$?
0
root @ 158479dec020:/#ejabberdctl停止
root @ 158479dec020:/#回显$?
0
root @ 158479dec020:/#ejabberdctl状态
到节点ejabberd @ 158479dec020的RPC连接失败:nodedown
root @ 158479dec020:/#回显$?
3
因此,这告诉我们,如果您运行
ejabberd status
且守护程序未运行,则会收到退出代码3
和0
(如果启动并正在运行)。在那里,您可以使用bash脚本:
函数run(){
ejabberdctl start#重复以防万一...
ejabberdctl状态&>/dev/null
如果[$? -eq 0];然后
echo“在这里做一些魔术,ejabberd正在运行...”
导出0
科幻
回声“Ejabberd仍在下降...”
}
虽然是真的跑 sleep 1;完毕
这就是您在CLI上所能得到的:
root @ 158479dec020:/#./check.sh
Ejabberd仍然失望...
在这里做一些魔术,ejabberd正在运行...
root @ 158479dec020:/#ejabberdctl停止
root @ 158479dec020:/#./check.sh
Ejabberd仍然失望...
Ejabberd仍然失望...
在这里做一些魔术,ejabberd正在运行...
关于docker - 在Docker构建期间启动服务,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43392132/