Рішення DOCKER:
Схоже, докер-композит 1.5+ і більше включив заміну змінних: https://github.com/docker/compose/releases
Остання версія Docker Compose дозволяє отримати доступ до змінних оточуючих середовищ із композиційного файлу. Таким чином, ви можете джерелом змінних вашого середовища, а потім запустіть Compose так:
set -a
source .my-env
docker-compose up -d
Тоді ви можете посилатися на змінні в docker-compose.yml, використовуючи $ {VARIABLE}, наприклад:
db:
image: "postgres:${POSTGRES_VERSION}"
А ось докладнішу інформацію про документи, взяті тут: https://docs.docker.com/compose/compose-file/#variable-substitution
Коли ви запускаєте docker-compose з цією конфігурацією, Compose шукає змінну середовища POSTGRES_VERSION у оболонці та замінює її значення дюйма. У цьому прикладі Compose вирішує зображення на постгреси: 9.3 перед запуском конфігурації.
Якщо змінна середовища не встановлена, Compose замінює порожній рядок. У наведеному вище прикладі, якщо POSTGRES_VERSION не встановлено, значенням параметра зображення є postgres :.
Підтримуються синтаксис $ VARIABLE та $ {VARIABLE}. Розширені функції типу оболонки, такі як $ {VARIABLE-default} та $ {VARIABLE / foo / bar}, не підтримуються.
Якщо вам потрібно встановити буквальний знак долара у значенні конфігурації, використовуйте подвійний знак долара ($$).
І я вважаю, що ця функція була додана в цьому запиті на потяг: https://github.com/docker/compose/pull/1765
Рішення BASH:
Я помічаю, що у людей є проблеми із підтримкою змінних середовища Docker. Замість того, щоб мати справу зі змінними середовища в Docker, повернемося до основ, як bash! Ось більш гнучкий метод, що використовує скрипт bash та .env
файл.
Приклад .env-файлу:
EXAMPLE_URL=http://example.com
# Note that the variable below is commented out and will not be used:
# EXAMPLE_URL=http://example2.com
SECRET_KEY=ABDFWEDFSADFWWEFSFSDFM
# You can even define the compose file in an env variable like so:
COMPOSE_CONFIG=my-compose-file.yml
# You can define other compose files, and just comment them out
# when not needed:
# COMPOSE_CONFIG=another-compose-file.yml
потім запустіть цей скрипт bash в тому самому каталозі, який повинен все правильно розгорнути:
#!/bin/bash
docker rm -f `docker ps -aq -f name=myproject_*`
set -a
source .env
cat ${COMPOSE_CONFIG} | envsubst | docker-compose -f - -p "myproject" up -d
Просто посилайтеся на ваші змінні env у вашому композиційному файлі зі звичайним синтаксисом bash (тобто, ${SECRET_KEY}
щоб вставити файл SECRET_KEY
із цього .env
файлу).
Зверніть увагу , що COMPOSE_CONFIG
визначається в моєму .env
файлі і використовувати в моєму БАШЕЄВ скрипті, але ви можете легко замінити тільки {$COMPOSE_CONFIG}
з my-compose-file.yml
в сценарії Баша.
Також зауважте, що я позначив це розгортання, називаючи всі мої контейнери префіксом "мій проект". Ви можете використовувати будь-яке ім’я, яке ви хочете, але це допомагає визначити ваші контейнери, щоб ви могли легко посилатися на них пізніше. Якщо припустити, що ваші контейнери без стану, як це має бути, цей скрипт швидко видалить і перерозподілить ваші контейнери відповідно до ваших параметрів файлу .env та ваших композиційних файлів YAML.
Оновлення
Оскільки ця відповідь здається досить популярною, я написав допис у блозі, де більш глибоко описується мій робочий процес розгортання Docker: http://lukeswart.net/2016/03/lets-deploy-part-1/ Це може бути корисним при додаванні більша складність конфігурації розгортання, як-от конфігурації nginx, серти LetsEncrypt та пов'язані контейнери.