updates - docker swarm 中的软重启守护进程容器
问题描述
我们使用多个 PHP 工作者。每个 PHP 工作者都组织在一个容器中。为了扩展并行工作进程的数量,我们在 docker swarm 中处理它。
因此 PHP 正在循环运行并等待新作业(从 Gearman 获取作业)。如果正在接收新作业,则会对其进行处理。之后,脚本正在等待下一个作业,而不退出/离开 PHP 脚本。
现在我们要更新我们的工人。在这种情况下,图像是相同的,但 PHP 脚本已更改。所以我们要离开PHP脚本,更新PHP脚本文件,重启PHP脚本。
如果我使用这个 docker service update 命令。Docker 将立即停止容器。在最坏的情况下,正在运行的工作人员将在此工作期间被取消。
docker service update --force PHP-worker
是否有可能重新启动 docker 容器软件?软的意思是,给容器一个标志:“我要重新启动,请取消所有正在运行的进程。” 那个容器有机会辞掉他的工作。
就我而言,在我运行循环中的下一个进程之前。我会检查这个取消标志。如果设置了这个取消标志,我将结束循环并结束运行 PHP 脚本。
环境:
- 德比安:10
- 码头工人:19.03.12
- PHP: 7.4
解决方案
与此同时,我们已经用 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”。
推荐阅读
- sql - 如何“解包”存储在 PostgreSQL 数据库中的 JSON 数组?
- node.js - 根据 ID 从文档搜索中检索数组的前三个元素
- python - 为什么我的 autorole bot 可以在我的服务器上运行,而在其他服务器上不行?
- .net - VB.NET - MsDb2 查询持续时间
- c++ - 带有双括号的 C++ if 语句有什么作用?
- javascript - 为什么在类方法中使用 ES6 的 Proxy 不起作用?
- css - WOFF webfont 生成器生成大量垃圾(可能是原始字体)数据
- vba - 输出哪些 Excel 文件受密码保护
- php - 将数据颤动应用程序发布到 postgresql db php
- swift - 有没有办法检查信息面板当前是否在 AVPlayerViewController 中切换?