Повторное использование переменных окружения в docker-compose yml

Можно ли повторно использовать переменные среды, которые совместно используются несколькими контейнерами, чтобы избежать дублирования, как показано в этом примере:

version: '2'

services:

  db:
    image: example/db
    ports:
      - "8443:8443" 
    container_name: db
    hostname: db
    environment:
      - USER_NAME = admin 
      - USER_PASSWORD = admin 

svc:
  image: example/svc
  depends_on:
    - db
  ports:
    - "9443:9443"
  container_name: svc
  hostname: svc
  environment:
    - DB_URL = https://db:8443
    - DB_USER_NAME = admin
    - DB_USER_PASSWORD = admin 

Ответ 1

Опция extends может быть полезной, но она не поддерживается в 3.x compose files. Другие способы пойти:

  1. Поля расширения (составьте файл 3. 4+)

    Если вы можете использовать 3. 4+ составьте файлы, поля расширения, вероятно, лучший вариант:

    докер-compose.yml

    version: '3.4'
    
    x-common-variables: &common-variables
      VARIABLE: some_value
      ANOTHER_VARIABLE: another_value
    
    services:
      some_service:
        image: someimage
        environment: *common-variables
    
      another_service:
        image: anotherimage
        environment:
          <<: *common-variables
          NON_COMMON_VARIABLE: 'non_common_value'
    
  2. директива env_file

    докер-compose.yml

    version: '3.2'
    
    services:
      some_service:
        image: someimage
        env_file:
          - 'variables.env'
    
      another_service:
        image: anotherimage
        env_file:
          - 'variables.env'
    

    variables.env

    VARIABLE=some_value
    ANOTHER_VARIABLE=another_value
    
  3. Файл .env в корне проекта (или переменные в реальной среде создания)

    На переменные из файла .env можно ссылаться в конфигурации сервиса:

    докер-compose.yml

    version: '3.2'
    
    services:
      some_service:
        image: someimage
        environment:
          - VARIABLE
    
      another_service:
        image: anotherimage
        environment:
          - VARIABLE
          - ANOTHER_VARIABLE
    

    .env

    VARIABLE=some_value
    ANOTHER_VARIABLE=another_value
    

Ответ 2

Вы можете использовать директиву extends, чтобы несколько контейнеров наследовали конфигурацию environment из базового описания службы. Например, поместите в файл с именем base.yml следующее:

version: '2'

services:
  base:
    environment:
      DB_URL: https://db:8443
      DB_USER_NAME: admin
      DB_USER_PASSWORD: admin 

Затем в docker-compose.yml:

version: '2'

services:
  container1:
    image: alpine
    command: sh -c "env; sleep 900"
    extends:
      file: base.yml
      service: base

  container2:
    image: alpine
    command: sh -c "env; sleep 900"
    extends:
      file: base.yml
      service: base
    environment:
      ANOTHERVAR: this is a test

Затем внутри container1 вы увидите:

DB_URL=https://db:8443
DB_USER_NAME=admin
DB_USER_PASSWORD=admin

И внутри container2 вы увидите:

DB_URL=https://db:8443
DB_USER_NAME=admin
DB_USER_PASSWORD=admin
ANOTHERVAR=this is a test

Очевидно, вы можете использовать extends для вещей, отличных от директивы environment; это отличный способ избежать дублирования при использовании docker-compose.

Ответ 3

Вы можете ссылаться на локальные переменные окружения из файла компоновки docker. Предполагая, что вы хотите сделать, сделайте USER_NAME так же, как DB_USER_NAME:

Докер-compose.yml

version: '2'

services:
  db:
    image: example/db
    ports:
      - "8443:8443" 
    container_name: db
    hostname: db
    environment:
      - USER_NAME = ${USERNAME}
      - USER_PASSWORD = ${PASSWORD}

svc:
  image: example/svc
  depends_on:
    - db
  ports:
    - "9443:9443"
  container_name: svc
  hostname: svc
  environment:
    - DB_URL = https://db:8443
    - DB_USER_NAME = ${USERNAME}
    - DB_USER_PASSWORD = ${PASSWORD}

Затем запустите docker-compose, например:

$ USERNAME="admin" PASSWORD="admin" docker-compose up

Альтернативно, для чего-то более постоянного и более легкого для ввода на регулярной основе:

$ printf '%s\n%s\n' 'export USERNAME="admin"' 'export PASSWORD="admin"' >> ~/.bash_profile
$ source ~/.bash_profile
$ docker-compose up

Ответ 4

Могу ли я использовать тот же подход для обмена секретами докера? Если да - как?