在我的docker-compose
中,我有多个客户端和工作程序类,特别是类型A的客户端,类型B的一个客户端和类型C的另一个客户端,以及它们各自的工人类。每次执行docker-compose
时,如果要为每个类使用多个不等于1的容器,则总共需要使用选项--scale
6次:--scale cliA=2 --scale cliB=3 [...]
。除了在我的docker-compose.yml
上拥有类之外,还有别的选择为客户提供统一的类,而该类对于每个不同的类(对于工人而言,都相同)可以按比例缩放?
我已经对此进行了推理,并且得出的结论是,可能可以执行以下操作(请在问题末尾的代码上进行检查,以供cli
类参考):>
cli:
image: client
// More stuff
scale: 4
environment:
CLASSID=A
scale: 2
environment:
CLASSID=B
// [...]
此docker-compose.yml
可以根据需要创建类,而无需每次都调用--scale
。但是,我检查了the reference for docker-compose
,但没有找到任何对我有帮助的东西。我发现有一个insightful post,其中提到我可以使用docker-swarm
来完成此任务,但我认为这超出了主题的范围(此问题试图回答练习)。>
这是docker-compose.yml
文件的代码:
version: '2'
services:
cliA:
image: client
build: ./client/
links:
- bro
environment:
- BROKER_URL=tcp://bro:9998
- CLASSID=A
// Similar description for cliB, cliC; only CLASSID changes
worA:
image: worker
build: ./worker/
links:
- bro
environment:
- BROKER_URL=tcp://bro:9999
- CLASSID=A
// Similar description for worB, worC; only CLASSID changes
bro:
image: broker
build: ./broker/
expose:
- "9998"
- "9999"
感谢您的帮助。
答案 0 :(得分:1)
服务是有关如何运行容器以及所有设置的定义。如果需要使用不同设置运行的多个容器,则需要不同的服务。您可以使用Yaml别名和锚点语法将一个服务有效地复制到另一个服务,然后应用更改,例如:
version: "3"
services:
app1: &app1
image: app
environment:
app: 1
app2:
<<*app1
environment:
app: 2
将问题分解为多种服务后,您可以按照your linked question的建议进行操作。
我还看到了在撰写文件中使用变量的可能性。例如
version: '2'
services:
cli:
image: client
build: ./client/
links:
- bro
environment:
- BROKER_URL=tcp://bro:9998
- CLASSID=${CLASSID}
scale: ${SCALE}
然后您可以使用各种环境文件进行部署:
$ cat envA.sh
CLASSID=A
SCALE=4
$ cat envB.sh
CLASSID=B
SCALE=2
$ set -a && . ./envA.sh && set +a && docker-compose -p projA up
$ set -a && . ./envB.sh && set +a && docker-compose -p projB up