在整个 docker 构建过程中保留一个过程 运行

Keep a process running throughout docker build process

我试图在整个构建过程中将 devpi 实例 运行 保留在容器中,以便后续 运行 命令可以使用它并在构建过程中填充它的数据库。例如

FROM centos:centos7 
RUN pip install devpi
RUN devpi-server --host=0.0.0.0 --port=3141
RUN some other task that interacts with devpi-server
...

这可能吗?到目前为止我一直无法让它工作

我想如果你想 运行 在后台执行某个命令,你可能需要 运行:

nohup command &

但在你的情况下,因为你想 运行 它在图像构建期间在后台运行,这可能对你有帮助:

FROM ubuntu:18.04

RUN apt-get update
RUN apt-get install -y inetutils-ping
# Using sleep will give the command some time to be executed completely
RUN sleep 10 ; ping localhost -c 3 > xxx.log

如您所见,我正在 运行 同时执行睡眠命令和 ping 命令,方法是将它们与 ; 分开,让我们假设在您的示例中,构建期间填充其数据库的估计时间可能需要大约 2 分钟,因此将睡眠时间设置为接近该间隔可以解决您的问题。

PS: Make sure to know the difference between RUN and CMD, since docker build will actually create a temporary container to test the RUN commands then remove it once the build is done.

我明白了。我需要添加一个单独的 shell 脚本,它既启动 devpi-server 又执行与之交互的命令。然后我可以启动进程并在同一个 运行 命令中与其交互。

FROM centos:centos7 
RUN pip install devpi
ADD start-devpi.sh
RUN chmod +x start-devpi.sh
RUN ./start-devpi.sh

start-devpi.sh 看起来像

devpi-server --host=0.0.0.0 &
sleep 15 #wait for the server to come online
put further commands that use the running devpi-server instance here
...