【问题标题】:Keep the docker container running while stopping and starting the process在停止和启动进程时保持 docker 容器运行
【发布时间】:2017-08-21 01:56:22
【问题描述】:

我有一个 spring boot jar,我在运行 Docker 容器时调用它。一切运行良好。

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

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

【问题讨论】:

  • 如果您的容器因某些操作而停止,您可以使用restart funcionality, docker run .... restart on-failure

标签: docker spring-boot


【解决方案1】:

我不会讨论自动重启一个被杀死的容器,因为它不会回答你的问题(但根据你的情况,你可能会问自己为什么这个解决方案不符合你的需求)。

当你的镜像中定义的入口点启动的主进程在容器中被杀死时,容器就会停止。因此,为避免停止容器,请使用在某些操作需要重新启动 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

【讨论】:

  • 谢谢,亚历山大。我遵循了您建议的方法,现在一切正常。
猜你喜欢
  • 2020-07-17
  • 1970-01-01
  • 2019-04-28
  • 1970-01-01
  • 2016-08-23
  • 2014-11-04
  • 1970-01-01
  • 2018-09-29
  • 1970-01-01
相关资源
最近更新 更多