如何在没有--scale的情况下使用docker-compose指定容器数量?

时间:2019-01-07 12:17:22

标签: docker docker-compose replication

在我的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"

感谢您的帮助。

1 个答案:

答案 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