在停止并启动进程时保持docker容器运行

时间:2017-08-21 01:56:23

标签: docker spring-boot

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

现在,还有一些其他操作也支持这个jar。为了使用这些操作,我必须再次调用jar(进入容器内部)传递所需的参数。问题是某些操作会终止已经运行的进程,无论需要做什么更改,都会再次启动应用程序。一旦进程被杀死,Docker容器也会停止。

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

1 个答案:

答案 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