【问题标题】:Self updating docker stack自我更新的码头工人栈
【发布时间】:2019-04-24 18:37:41
【问题描述】:
我有一个部署了 20 多个服务的 docker 堆栈,这些服务构成了我的应用程序。我想知道有没有一种方法可以在作为堆栈的一部分运行的容器中使用对软件的最新更改来更新此堆栈?
我尝试过的方法:
- 在其中一个服务容器中,挂载 docker 套接字和 /usr/bin/docker 文件,并从服务器下载最新的 compose 文件。
- 实例化了一个下载最新图像的脚本
- 使用新的撰写文件启动
docker stack deploy
以这种方式一切正常,但如果运行此进程的服务本身有更新,并且如果 docker stack deploy 尝试在堆栈中的任何其他服务之前创建此服务,则堆栈更新失败。
对此有何建议或替代方法?
【问题讨论】:
标签:
docker
docker-compose
dockerfile
docker-swarm
auto-update
【解决方案1】:
执行此操作的标准方法是构建一个包含新应用程序代码的新 Docker 映像。用一些独特的版本标记它(如在docker build -t 参数中),如源代码控制标记或日期戳。使用新的应用程序代码启动一个新容器,然后停止并删除旧容器。
作为一般规则,您不升级正在运行的容器内的软件。删除旧容器并使用您想要的软件和版本启动一个新容器。此外,这通常由操作员、持续部署系统或编排系统管理,而不是由容器本身管理。 (将 Docker 套接字安装到容器中是一个重大的安全隐患。)
(想象一下,为您的集群设置第二个副本,它的工作方式与您的生产集群完全相同,只是它具有您希望明天部署的软件。您不希望您的生产集群自行获取它直到您对其进行测试。此方案应该为您提供可重复的部署设置,以便轻松启动该预生产集群,同时还可以让您控制哪些特定版本在哪里运行。)
【解决方案2】:
对于 docker swarm 模式没有开箱即用的解决方案(类似于单个 docker 的瞭望塔)。我认为您已经找到了自动执行此操作的最佳解决方案。我建议您将更新容器(正在更新服务的容器)放在忽略列表中。然后在您的一个主节点上,创建一个更新该容器的 cron。我知道这不是一个完美的解决方案,但它应该可以工作。