我怎样才能获得" docker-compose scale"为创建的任何其他实例使用最新图像?

时间:2017-09-11 00:13:50

标签: docker docker-compose

在我的项目中,我有许多相互依赖的微服务。我正在使用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 Compose不会使用它 - 它固执地使用与已经运行的实例相同的哈希。我已经检查了docker-compose scale --help,并且没有任何内容与强制使用新图片有关。

现在我可以使用普通的docker run,但是我必须复制我在{{1}为此服务设置的所有选项我不知道在Compose文件之外运行的东西是否会被理解为该Compose应用程序的一部分(例如,尽管已经手动启动,它是否会以docker-compose.yml停止?)。

以后版本的Docker Compose可能在缩放功能(it has been merged with up anyway)中有更多选项。

获得此功能的最简单方法是什么?

(旁白:我很欣赏有无数的编排工具可以进行轻柔的重启和其他魔法,当我有空的时候,我一定会探索那个无底洞。现在,我觉得写一些脚本要做一些部署任务是更快的胜利。)

1 个答案:

答案 0 :(得分:0)

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

作为测试,我有一个名为missive-storage的图像,我在Dockerfile中添加了一个虚拟更改,因此docker ps会将正在运行的容器中的图像名称报告为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

如您所见,这给了我两个运行容器,一个基于旧图像,另一个基于新图像。从这里我可以通过向前端代理发送配置更改来重定向流量,然后stop旧容器。

请注意--no-recreate很重要 - 如果没有它,Docker Compose似乎可能会重启所有内容,从而破坏了练习的目标。