如何延迟 Docker Swarm 更新有状态容器直到它准备好?
How to delay Docker Swarm updating a stateful container until it's ready?
问题域
假设一个有状态容器由 Swarm 管理,例如一个数据库,另一个容器依赖它,例如一项正在执行长时间 运行 作业(几分钟,有时几小时)的服务,它不允许数据库(甚至它本身)在执行时宕机。
举个例子,导入多 GB 转储的数据库。
还有一个 CI/CD 系统负责构建新版本的容器并将它们部署到 Swarm,或者将图像推送到 Docker Hub,然后调用定义的 webhook这会触发部署事件。
问题
有什么方法可以构建我的容器,以便 Swarm 知道是否可以更新它?同样,HEALTHCHECK
报告它是否需要重新启动,这会让 Swarm 知道“现在可以安全地重新启动该容器”。
或者 CI/CD 系统有责任检查有状态容器是否可以安全重启,然后才向 swarm 发出更新命令?
提前致谢!
Docker 不会检查容器是否准备好停止,一旦您向 docker 命令停止容器,它就会执行该操作。但是,它分两步执行停止。第一步是 SIGTERM
,您的容器可以捕获并妥善处理。默认情况下,在 10 秒后,发送一个 SIGKILL
,Linux 内核立即应用并且不会被容器捕获。为了您的目标,您需要确保您的应用知道在收到第一个信号后何时可以安全退出,并且您可能希望将信号之间的时间延长至 10 秒以上。
运行状况检查不会告诉 docker 您的容器处于可以停止的安全点。它确实会告诉 swarm 您的容器何时已完成启动,或者何时行为不当需要停止和更换。 healthcheck 在您的容器内定义一个命令 运行,并检查退出代码是 0(健康)还是 1(不健康)。目前没有其他有效的退出代码。
如果您需要的不仅仅是容器内的简单信号处理,那么是的,您可能需要将堆栈向上移动到 ci/cd 工具来管理部署。
问题域
假设一个有状态容器由 Swarm 管理,例如一个数据库,另一个容器依赖它,例如一项正在执行长时间 运行 作业(几分钟,有时几小时)的服务,它不允许数据库(甚至它本身)在执行时宕机。
举个例子,导入多 GB 转储的数据库。
还有一个 CI/CD 系统负责构建新版本的容器并将它们部署到 Swarm,或者将图像推送到 Docker Hub,然后调用定义的 webhook这会触发部署事件。
问题
有什么方法可以构建我的容器,以便 Swarm 知道是否可以更新它?同样,HEALTHCHECK
报告它是否需要重新启动,这会让 Swarm 知道“现在可以安全地重新启动该容器”。
或者 CI/CD 系统有责任检查有状态容器是否可以安全重启,然后才向 swarm 发出更新命令?
提前致谢!
Docker 不会检查容器是否准备好停止,一旦您向 docker 命令停止容器,它就会执行该操作。但是,它分两步执行停止。第一步是 SIGTERM
,您的容器可以捕获并妥善处理。默认情况下,在 10 秒后,发送一个 SIGKILL
,Linux 内核立即应用并且不会被容器捕获。为了您的目标,您需要确保您的应用知道在收到第一个信号后何时可以安全退出,并且您可能希望将信号之间的时间延长至 10 秒以上。
运行状况检查不会告诉 docker 您的容器处于可以停止的安全点。它确实会告诉 swarm 您的容器何时已完成启动,或者何时行为不当需要停止和更换。 healthcheck 在您的容器内定义一个命令 运行,并检查退出代码是 0(健康)还是 1(不健康)。目前没有其他有效的退出代码。
如果您需要的不仅仅是容器内的简单信号处理,那么是的,您可能需要将堆栈向上移动到 ci/cd 工具来管理部署。