Есть ли способ в docker compose создать константу кросс-сервиса? - PullRequest
0 голосов
/ 12 октября 2018

У меня есть файл составления, подобный этому:

service1:
   //some stuff
   environment:
  - "PROP=some_common_value"
service2:
  //some stuff
  environment:
  - "PROP=some_common_value"
service2:
  //some stuff
  environment:
  - "PROP=some_common_value"

Я хочу установить свойства с одинаковыми значениями.

Как вы можете теперь я скопировать мимо этого значения.Это выглядит ужасно.
Есть ли способ в docker compose создать константу кросс-сервиса?

1 Ответ

0 голосов
/ 19 октября 2018

Есть пара вариантов.Если вы используете docker-compose, а не docker stack deploy, вы можете использовать файл .env для установки переменных.В режиме docker-compose или swarm вы можете установить переменную окружения в своей оболочке (часто это сценарий оболочки, используемый для развертывания приложения).Внутри yaml вы должны использовать переменную окружения, например:

service1:
  environment:
  - PROP
service2:
  environment:
  - PROP
service2:
  environment:
  - PROP

или явно использовать переменную, например:

service1:
  environment:
  - PROP=${PROP}
service2:
  environment:
  - PROP=${PROP}
service3:
  environment:
  - PROP=${PROP}

Если у вас есть файл .env и вы хотите сделатьdocker stack deploy, вы можете написать сценарий обработки этого с помощью одного из:

# option 1, leaves vars set in shell
set -a && . .env && set +a && docker stack deploy -c compose.yml stack_name

# option 2, only sets vars for single command
env $(cat .env | xargs) docker stack deploy -c compose.yml stack_name

В каждом из вышеперечисленных символов .env - это просто переменные, которые вы могли бы установить в своей оболочке:

PROP=some_common_value

Следующая опция - использовать синтаксис Yaml для якорей и псевдонимов.Это копирует из одного раздела файла Yaml в другой (для поддержки слияния в service3 я переключился на ключ / значение вместо синтаксиса массива):

service1:
  environment: &common_env
    PROP: "some_common_value"
service2:
  environment: *common_env
service3:
  environment:
    <<: *common_env
    PROP3: "unique value"

Чтобы каждая служба имела уникальныйзначения, Docker добавил поля расширения в последних версиях составного синтаксиса.Это позволяет вам определять привязку отдельно от любого определения службы и объединять ее с каждой службой, каждый со своими уникальными значениями, например:

version: '3.4'
x-common-env: &common_env
  PROP: "some_common_value"
services:
  service1:
    environment:
      <<: *common_env
      PROP1: "unique value 1"
  service2:
    environment:
      <<: *common_env
      PROP2: "unique value 2"
  service3:
    environment:
      <<: *common_env
      PROP3: "unique value 3"
...