【问题标题】:Soft restart daemon containers in docker swarmdocker swarm 中的软重启守护进程容器
【发布时间】:2021-08-07 16:49:31
【问题描述】:

我们使用多个 PHP 工作者。每个 PHP 工作者都组织在一个容器中。为了扩展并行工作进程的数量,我们在 docker swarm 中处理它。

所以 PHP 正在循环运行并等待新作业(从 Gearman 获取作业)。 如果正在接收新作业,则会对其进行处理。之后,脚本正在等待下一个作业而不退出/离开 PHP 脚本。

现在我们要更新我们的工人。在这种情况下,图像是相同的,但 PHP 脚本已更改。 所以我们要离开PHP脚本,更新PHP脚本文件,重启PHP脚本。

如果我使用这个 docker service update 命令。 Docker 将立即停止容器。在最坏的情况下,正在运行的工作人员将在此工作期间被取消。

docker service update --force PHP-worker

是否有可能重新启动 docker 容器软件? 软的意思是,给容器一个标志:“我要重新启动,请取消所有正在运行的进程。”容器有机会辞掉他的工作。

就我而言,在我运行循环中的下一个进程之前。我会检查这个取消标志。如果设置了这个取消标志,我将结束循环并结束运行 PHP 脚本。

环境:

  • Debian:10
  • 码头工人:19.03.12
  • PHP:7.4

【问题讨论】:

    标签: updates docker-swarm docker-container


    【解决方案1】:

    与此同时,我们已经用 SIGNALS 解决了这个问题。

    在 PHP 中使用信号非常容易。在我们的例子中,这种结构帮助了我们。

    //Terminate flag
    $terminate = false;
    
    //Register signals
    pcntl_async_signals(true);
    pcntl_signal(SIGTERM, function() use (&$terminate) {
      echo"Get SIGTERM. End worker LOOP\n";
      $terminate = true;
    });
    pcntl_signal(SIGHUP, function() use (&$terminate) {
      echo"Get SIGHUP. End worker LOOP\n";
      $terminate = true;
    });
    
    //loop
    while($terminate === false){
      //do next job
    }
    

    在下一个作业开始之前,它会检查是否设置了终止标志。

    Docker 非常支持优雅地停止容器。 为了定义等待时间,我们使用了标签“stop_grace_period”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-20
      • 1970-01-01
      • 2017-01-23
      • 2016-10-26
      • 1970-01-01
      • 2017-05-16
      • 1970-01-01
      • 2018-04-05
      相关资源
      最近更新 更多