我有一个运行 Adobe 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,点击这个按钮也没有等待足够长的时间,虽然我不确定它在幕后调用了什么,我不确定如何确定。
总结:
预期结果:任何开始使用 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
不会得到尊重。