我想在 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 实用程序时的典型错误,但节点实际上并未启动:
与节点 ejabberd@localhost 的 RPC 连接失败
命令 '/bin/sh -c ejabberdctl start && ejabberdctl modules_update_specs && ejabberdctl module_install ejabberd_auth_http' 返回一个非零代码:3
这可能是因为服务的启动需要一点时间,比执行第二个命令所需的时间长,所以第二个命令运行到一个刚刚启动的节点。不确定这有多大可能。第二个原因可能是依赖 init.d 的服务在构建过程中无法在 Docker 中启动。
我构建容器直到导致问题的那一行,进入容器并手动执行命令,一切正常。
所以总结一下,我想在构建期间启动 ejabberd 服务器,然后使用它的控制实用程序来安装一些东西。最后一个选择是在不运行服务器的情况下手动安装模块,但是我更喜欢使用 ejabberdctl 控制实用程序来安装。