在我的项目中,我有许多相互依赖的微服务。我正在使用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)中有更多选项。
获得此功能的最简单方法是什么?
(旁白:我很欣赏有无数的编排工具可以进行轻柔的重启和其他魔法,当我有空的时候,我一定会探索那个无底洞。现在,我觉得写一些脚本要做一些部署任务是更快的胜利。)
答案 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似乎可能会重启所有内容,从而破坏了练习的目标。