Как указать количество контейнеров, используя docker-compose без --scale? - PullRequest
0 голосов
/ 07 января 2019

В моем docker-compose у меня есть несколько классов клиента и рабочего, в частности клиент типа A, один типа B и другой типа C, с соответствующими рабочими классами. Каждый раз, когда я выполняю docker-compose, мне нужно использовать опцию --scale всего 6 раз, если я хочу использовать количество контейнеров, отличное от 1, для каждого класса: --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. Тем не менее, я проверил ссылку на docker-compose, но я не нашел ничего, что помогло бы мне. Я нашел проницательный пост , в котором упоминалось, что я мог бы использовать 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 голосов
/ 07 января 2019

Сервисы - это определение того, как запустить контейнер, а также все настройки. Если вам нужно несколько контейнеров, работающих с разными настройками, вам нужны разные сервисы. Вы можете использовать псевдоним Yaml и синтаксис привязки, чтобы эффективно копировать один сервис в другой, а затем применять изменения, например ::100100

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
...