我有一个弹簧启动jar,我在运行Docker容器时调用它。一切都运行良好。
现在,还有一些其他操作也支持这个jar。为了使用这些操作,我必须再次调用jar(进入容器内部)传递所需的参数。问题是某些操作会终止已经运行的进程,无论需要做什么更改,都会再次启动应用程序。一旦进程被杀死,Docker容器也会停止。
如何在整个过程中保持容器运行?
答案 0 :(得分:2)
我不会讨论自动重启一个被杀死的容器,因为它不会回答你的问题(但根据你的情况,你可能会问自己为什么这个解决方案不符合你的需要)。
当您在映像中定义的入口点启动的主进程在容器中被终止时,容器将停止。因此,为避免停止容器,请使用在某些操作需要重新启动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