我怎样才能得到“docker – 组成规模”使用最新的形象创build的任何额外的实例?

在我的项目中,我有一些互相依赖的微服务。 我正在使用Docker Compose将所有内容按正确顺序排列。

在开发过程中,当我为容器编写一些新代码时,容器需要重新启动,以便可以尝试新代码。 到目前为止,我只是在重新启动整个事情,因此:

docker-compose down && docker-compose up -d 

这样可以正常工作,但是把所有的东西都放下来需要花费20秒,这对于现场环境来说太长了。 因此,我正在研究各种策略,以确保微型服务可以单独重新启动而不会中断。

我的第一个方法,几乎​​可行,是扩大服务重启,从一个实例到两个。 然后,我以编程方式重置反向代理(Traefik),以指向新的实例,然后当这很开心,我docker stop在旧的。

由于我使用了Compose 1.8.0,因此我的缩放命令是旧的。 它看起来像这样:

 docker-compose scale missive-storage-backend=2 

唯一的问题是,如果有一个新的图像,Docker撰写不使用它 – 它固执地使用与已经运行的实例相同的散列。 我已经检查了docker-compose scale --help ,没有任何内容涉及强制使用新的图像。

现在我可以使用一个普通的docker run ,但是我不得不复制我在docker-compose.yml为这个服务设置的所有选项,而且我不知道是否在Compose文件之外运行应该被理解为是该Compose应用程序的一部分(例如docker-compose down尽pipe已经手动启动,它是否会停靠在docker-compose down )。

Docker Compose的后续版本也可能在scale函数中有更多的选项( 反正它已经合并了 )。

什么是最简单的方法来获得这个function?

(另外:我很欣赏有很多的编排工具可以轻松地重新启动,还有其他的魔法,当我有时间的时候,我一定会探索那个无底洞。现在,我觉得编写几个脚本来完成一些部署任务是更快的胜利。)

我已经解决了这个问题 首先,我尝试升级到Compose 1.9,但似乎没有提供我需要的更改。 然后我碰到了1.13,当时scale作为一个单独的命令被弃用,并且作为up命令的切换出现。

作为一个testing,我有一个名为missive-storage的图像,我添加了一个虚拟变化到Dockerfile中,所以docker docker ps d4ebdee0f3e2正在运行的容器中的图像名称改为d4ebdee0f3e2 (因为d4ebdee0f3e2 missive-storage:latest已经改变)。

ps行看起来像这样:

 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 45b8023f6ef1 d4ebdee0f3e2 "/usr/local/bin/du..." 4 minutes ago Up 4 minutes app_missive-storage-backend_1 

然后我发出这个命令( missive-storage-backend是图像missive-storage的DC服务名称):

 docker-compose up -d --no-recreate --scale missive-storage-backend=2 

这导致这些容器:

 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 0bd6577f281a missive-storage "/usr/local/bin/du..." 2 seconds ago Up 2 seconds app_missive-storage-backend_2 45b8023f6ef1 d4ebdee0f3e2 "/usr/local/bin/du..." 4 minutes ago Up 4 minutes app_missive-storage-backend_1 

正如你所看到的,这给了我两个正在运行的容器,一个基于旧图像,一个基于新图像。 从这里我可以通过向前端代理发送configuration更改来redirectstream量,然后stop旧容器。

请注意,– --no-recreate非常重要 – 如果没有它,Docker Compose似乎很容易重新启动一切,从而击败了练习的对象。