在停泊和启动过程中,保持docker集装箱运行

我有一个弹簧启动jar,我正在调用运行Docker容器。 一切运行良好。

现在,这个jar还有一些其他的操作。 为了使用这些操作,我必须再次调用jar(进入容器)传递所需的参数。 问题是有些操作会杀死已经运行的进程,不pipe需要什么改变,然后再启动应用程序。 一旦进程死亡,Docker容器也会停止。

如何在整个过程中保持容器运行?

我不会讨论自动重新启动一个死的容器,因为它不会回答你的问题(但根据你的情况,你也许会问自己为什么这个解决scheme不适合你的需要)。

在图像中定义的入口点启动的主进程在容器中被终止时,容器将停止。 所以,为了避免停止容器,当一些操作需要重新启动Java应用程序时,使用不停止的入口点。 更重要的是,这个入口点本身可以​​启动操作,它将成为你的Java应用程序的一个进程控制器。

下面是一个Dockerfile的例子,你可以看到入口点是一个特定的shell,而不是直接的java容器。

 From [...] EXPOSE 443 [...] COPY entrypoint.sh /usr/local/bin CMD chmod 755 /usr/local/bin/entrypoint.sh ENTRYPOINT ["/usr/local/bin/entrypoint.sh"] 

现在,用这种方式写入你的entrypoint.sh:

 #!/bin/bash [...] # launch your spring boot jar in a subprocess java -jar target/myproject-0.0.1-SNAPSHOT.jar > /dev/null 2>&1 & # or mvn spring-boot:run > /dev/null 2>&1 & # you may detach your java process from the shell job list, if needed disown %1 # now wait infinitely for a "docker stop", that should be the only way to stop this container while sleep 1 do echo waiting for this container to be terminated # if needed, launch your app again (in case it has been terminated and not relaunched automatically) if ! ps auxgww | grep -v grep | grep java then java -jar target/myproject-0.0.1-SNAPSHOT.jar > /dev/null 2>&1 & # or mvn spring-boot:run > /dev/null 2>&1 & # you may detach your java process from the shell job list, if needed disown %1 fi done