Повторное использование переменных окружения в 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. Другие способы пойти:
-
Поля расширения (составьте файл 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'
-
директива 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
-
Файл .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
Могу ли я использовать тот же подход для обмена секретами докера? Если да - как?