如何在不使用 --scale 的情况下使用 docker-compose 指定容器数量?
How to specify number of containers using docker-compose without --scale?
在我的 docker-compose
中,我有多个客户端和工作人员 classes,特别是 A 型客户端、B 型客户端和 C 型客户端,以及他们各自的工作人员 class是的。每次我执行 docker-compose
我需要使用选项 --scale
总共 6 次,如果我想为每个 class 使用多个不同于 1 的容器: --scale cliA=2 --scale cliB=3 [...]
.除了在我的 docker-compose.yml
上设置 class 之外,还有一个替代方案,而是为客户端设置一个统一的 class,可以针对每个不同的 class 进行不同的缩放(对于工人)?
我已经推理过了,得出这样的结论是可以的(查看问题末尾的代码以供参考 cli
class):
cli:
image: client
// More stuff
scale: 4
environment:
CLASSID=A
scale: 2
environment:
CLASSID=B
// [...]
这个 docker-compose.yml
将能够根据需要创建 classes,而不需要每次都调用 --scale
。然而,我检查了 the reference for docker-compose
but I haven't found anything that helps me. I found an ,其中提到我可以使用 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"
感谢任何帮助。
服务是关于如何 运行 容器以及所有设置的定义。如果你需要多个容器运行不同的设置,你需要不同的服务。您可以使用 Yaml 别名和锚语法有效地将一项服务复制到另一项服务,然后应用更改,例如:
version: "3"
services:
app1: &app1
image: app
environment:
app: 1
app2:
<<*app1
environment:
app: 2
将问题分解为多个服务后,您可以遵循 的建议。
我还看到了在撰写文件中使用变量的可能性。例如
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
在我的 docker-compose
中,我有多个客户端和工作人员 classes,特别是 A 型客户端、B 型客户端和 C 型客户端,以及他们各自的工作人员 class是的。每次我执行 docker-compose
我需要使用选项 --scale
总共 6 次,如果我想为每个 class 使用多个不同于 1 的容器: --scale cliA=2 --scale cliB=3 [...]
.除了在我的 docker-compose.yml
上设置 class 之外,还有一个替代方案,而是为客户端设置一个统一的 class,可以针对每个不同的 class 进行不同的缩放(对于工人)?
我已经推理过了,得出这样的结论是可以的(查看问题末尾的代码以供参考 cli
class):
cli:
image: client
// More stuff
scale: 4
environment:
CLASSID=A
scale: 2
environment:
CLASSID=B
// [...]
这个 docker-compose.yml
将能够根据需要创建 classes,而不需要每次都调用 --scale
。然而,我检查了 the reference for docker-compose
but I haven't found anything that helps me. I found an 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"
感谢任何帮助。
服务是关于如何 运行 容器以及所有设置的定义。如果你需要多个容器运行不同的设置,你需要不同的服务。您可以使用 Yaml 别名和锚语法有效地将一项服务复制到另一项服务,然后应用更改,例如:
version: "3"
services:
app1: &app1
image: app
environment:
app: 1
app2:
<<*app1
environment:
app: 2
将问题分解为多个服务后,您可以遵循
我还看到了在撰写文件中使用变量的可能性。例如
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