使用 docker 堆栈部署和独立更新服务的 correct/better 方法是什么?

What is a correct/better way to use docker stack deploy with independently updated services?

我们有几个应用程序是一个更大的应用程序的一部分。

这些应用中的每一个都有一个基于每次提交的 Docker 图像。

我希望你使用 docker 集群模式,docker 自动堆叠到 deploy/update 这个更大的应用程序。

假设我有这个撰写文件(留下不相关的部分)

version: '3'
services:
    product_service:
       image: myregistry.com/product_service:c8372d
       ..
    cart_service:
       image: myregistry.com/cart_service:ee7f32
       ..

当我提交对购物车服务回购的更改时,我希望堆栈仅更新 cart_service,但将 product_service 固定在其当前版本。此外,当产品服务更新时,我希望能够仅更新该服务,但将购物车服务保留在当前固定的版本。

在这种情况下我有什么选择?

我能想到的:

我是不是忽略了什么?这样的建筑不是故意的吗?这里有什么更好的方法?

我发现使用最后一个选项最简单,将每个服务拆分到自己的堆栈中,而不触及任何其他内容。然后提升单个服务的堆栈。为此,我要添加两个先决条件:

  • 提前定义您的网络。然后在您的撰写中,将它们定义为外部以允许服务相互连接。这是将服务拆分为单独堆栈时损失的最大部分。

  • 运行 您自己的注册表。对我来说,这比仅仅依赖固定版本更安全。 Pinning 将确保您在 swarm 中的所有节点上拉取相同的版本,但是如果您从开发升级到测试再到 prod,这些将是单独的堆栈,并且可能完全分开 swarm。对我来说,依赖 repo 中仅以受控方式更新的标签(CI/CD 脚本)要容易得多。

独立堆栈的优点是可以独立更新每项服务而不会破坏其他任何内容。但另一方面,缺点是当发生影响一切的变化时,您需要独立更新每项服务。这可能意味着您需要更多 scripting/automation 来管理环境。