如何延迟Docker Swarm更新有状态容器直到其准备就绪?

时间:2018-07-06 10:18:14

标签: docker continuous-deployment

问题域

想象一个有状态的容器正在由Swarm管理,例如一个数据库,另一个容器依赖于该数据库,例如一种正在执行长时间运行的工作(几分钟,有时甚至几个小时)的服务,该服务不能容忍数据库(甚至是数据库本身)在执行时崩溃。

举个例子,一个数据库导入了一个多GB的转储。

还有一个CI / CD系统,该系统负责构建容器的新版本并将其部署到Swarm,或将映像推送到Docker Hub,然后调用已定义的Webhook来触发部署事件。< / p>

问题

有什么方法可以构建我的容器,以便Swarm知道是否可以更新它吗?同样,HEALTHCHECK如何报告是否需要重新启动,这会让Swarm知道“现在可以安全地重新启动此容器”。

或者是CI / CD系统有责任检查有状态容器是否可以安全地重新启动,然后才发出更新命令来蜂拥而至?

谢谢!

1 个答案:

答案 0 :(得分:1)

Docker不会检查容器是否已准备好停止,一旦您给docker命令停止容器,它将执行该操作。但是,它分两步执行停止。第一步是SIGTERM,您的容器可以陷阱并正常处理。默认情况下,在10秒后,将发送SIGKILL,表明Linux内核立即应用且不能被容器捕获。为了实现您的目标,您将需要确保您的应用知道收到第一个信号后何时可以安全退出,并且您可能希望将信号之间的时间延长到10秒以上。

运行状况检查不会告诉docker您的容器已安全停止。它确实会告诉swarm何时完成容器的启动,或者何时发生异常并需要停止和更换。运行状况检查定义了一个在容器内运行的命令,并检查退出代码是否为0(正常)或1(不正常)。当前没有其他退出代码有效。

如果您需要的不仅仅是容器内的简单信号处理,那么可以,您可能会将堆栈移至ci / cd工具来管理部署。