自我更新Docker堆栈

时间:2018-11-22 06:10:09

标签: docker docker-compose dockerfile docker-swarm auto-update

我有一个docker stack部署了20多个服务,这些服务构成了我的应用程序。我想知道是否有一种方法可以从作为堆栈一部分运行的多个容器中使用软件的最新更改来更新该堆栈?

我尝试过的方法:

  1. 在用于服务的容器之一中,安装docker套接字和/ usr / bin / docker文件,并从服务器下载最新的compose文件。
  2. 实例化了下载最新图像的脚本
  3. 使用新的撰写文件启动docker stack deploy

一切正常,但是如果运行此进程的服务本身具有更新,并且如果docker stack deploy尝试在堆栈中的任何其他服务之前创建此服务,则堆栈更新将失败。 有什么建议或替代方法吗?

2 个答案:

答案 0 :(得分:0)

执行此操作的标准方法是构建一个包含新应用程序代码的新Docker映像。用一些唯一的版本(例如,源代码控件标记或日期戳)标记它(如docker build -t参数中所示)。使用新的应用程序代码启动一个新容器,然后停止并删除旧容器。

通常,您升级正在运行的容器中的软件。删除旧容器,然后使用所需的软件和版本启动新容器。而且,这通常由操作员,连续部署系统或业务流程系统管理,而不是由容器本身管理。 (将Docker套接字安装到容器中会带来很大的安全隐患。)

(想象一下,设置集群的第二个副本与生产集群的工作方式完全相同,不同之处在于该集群具有您要在明天部署的软件。您不希望自己的生产集群自行选择该副本直到您对其进行了测试。此方案应为您提供可重现的部署设置,以便轻松启动该生产前群集,还可以控制在哪个特定版本在何处运行。)

答案 1 :(得分:0)

没有针对docker swarm模式的开箱即用解决方案(类似于单个docker的watch望塔)。我认为您已经找到了自动执行此操作的最佳解决方案。我建议您将更新容器(用于更新服务的容器)放在忽略列表中。然后在您的一个主节点上,创建一个cron来更新该容器。我知道这不是一个完美的解决方案,但是应该可以。