如何解决docker swarm 中的软重启守护进程容器
我们使用多个 PHP worker。每个 PHP Worker 都组织在一个容器中。为了扩展并行工作进程的数量,我们在 docker swarm 中处理它。
因此 PHP 循环运行并等待新作业(从 Gearman 获取作业)。 如果正在接收新作业,则会对其进行处理。之后,脚本等待下一个工作,而不退出/离开 PHP 脚本。
现在我们要更新我们的工作人员。在这种情况下,图像是相同的,但 PHP 脚本已更改。 所以我们要离开PHP脚本,更新PHP脚本文件,重启PHP脚本。
如果我使用这个 docker service update 命令。 Docker 会立即停止容器。在最坏的情况下,一个正在运行的工人会在这项工作中被取消。
docker service update --force PHP-worker
有没有可能重启docker容器软? 软的意思是,给容器一个标志:“我必须重新启动,请取消所有正在运行的进程。”容器有机会退出他的工作。
就我而言,在我运行循环中的下一个进程之前。我会检查这个取消标志。如果设置了这个取消标志,我将结束循环并结束运行 PHP 脚本。
环境:
- Debian:10
- Docker: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”。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。