Docker 服务重启策略 - 当新服务真正准备好时停止旧服务

use*_*729 5 docker docker-compose docker-swarm

我有 tomcat 在一个群中作为 docker 服务运行。当服务启动时,它会将大量数据加载到内存中,这取决于 10 到 30 分钟之间的数据量。

我的问题是,当我更新服务(order:start-first)时,旧容器在新容器初始化它的数据之前停止,因此还没有准备好使用。

在我看来,docker-compose 中的健康检查配置是一个很有前途的方法:

healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8080/areyouready"]
      interval: 10s
      timeout: 10s
      retries: 30
Run Code Online (Sandbox Code Playgroud)

健康检查工作正常,但旧服务也会关闭,而测试为新服务返回 1(不健康)。

我还尝试在我的应用程序中处理 SIGTERM:正在运行的服务获取 sigterm 并根据新服务的状态检查它是否应该已经停止:

 Runtime.getRuntime().addShutdownHook(new Thread()
        {
            @Override
            public void run()
            {
                // via db access determine the state of the new started containers, but I don't know
                // how to prevent my tomcat from stopping here
            }
        }
Run Code Online (Sandbox Code Playgroud)

除此之外,我没有设法阻止我的 tomcat 停止它,只是似乎不是正确的方法。

我想要的解决方案是配置这样的东西:

update_config: 
    order: start-first
    a-kind-of-stop-condition: ["CMD", "curl", "-f", "http://localhost:8080/areyouready"]
Run Code Online (Sandbox Code Playgroud)

然后条件请求应该转到新创建的容器,如果成功,旧的可能会停止。

如果你能指出我正确的方向,那就太好了。

亲切的问候,塞巴斯蒂安