码头工人停止不尊重 stop_grace_period

时间:2021-07-28 13:37:45

标签: docker docker-compose

我有一个运行 Adob​​e Experience Manager 的 Docker 容器。这是一个需要一段时间才能关闭的 Java 应用程序。过早关闭会导致存储库损坏,从而导致后续启动失败,并且通常需要我删除所有内容并从头开始。

我的 Dockerfile 只是运行:

CMD exec java \
    -Xms256m \
    -Xmx$INSTANCE_MAX_MEMORY \
    -Djava.awt.headless=true \
    -Xdebug \
    -Xnoagent \
    -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:$DEBUG_PORT \
    -jar /opt/aem/cq-quickstart.jar -p 4502 -r author \
    -v -nofork

这会将 Java 进程生成为 PID 1,这意味着它是在调用 docker stop 时接收 SIGTERM 的进程。

我的 docker-compose 文件将 stop_grace_period 定义为相当长的时间。

version: '3'
services:
  aem:
    stop_grace_period: 120s
    build:
      context: .
    ports:
      - "4502:4502"

如果我运行 docker compose up -d,服务会正确启动。

当我终止时,这就是我遇到问题的地方。取决于我如何杀死它,有时它不会等待 120 秒(而是在发送 SIGKILL 之前最多等待 10 秒)。

$ docker compose stop aem

等待时间够长。它甚至会计算命令输出中的时间,并且经常超过 10 秒。

$ docker stop aem

不等待。我知道如果我通过了

$ docker stop aem --time 120 aem

它会等待,但很容易忘记这样做并破坏您的服务器实例。

我也使用 IntelliJ,点击这个按钮也没有等待足够长的时间,虽然我不确定它在幕后调用了什么,我不确定如何确定。

An image of the cursor over the IntelliJ "stop" Button

总结:

预期结果:任何开始使用 docker-compose 并且设置了 stop_grace_period 的容器都会遵守该 stop_grace_period,即使在没有 docker stop [container-name] 的情况下调用 --time 也是如此。

实际结果:从 docker-compose 启动的容器仅在停止使用 docker-compose 时才尊重 stop_grace_period

所以我想知道的是:当一个容器从 docker-compose 启动时,stop_grace_period 是否不会被保存为该容器的某种元数据属性?似乎除非 docker-compose 在调用 stop 时在上下文中,否则 stop_grace_period 不会得到尊重。

0 个答案:

没有答案