Решение DOCKER:
Похоже, что docker-compose 1.5+ включил подстановку переменных: https://github.com/docker/compose/releases
Последняя версия Docker Compose позволяет получить доступ к переменным окружения из вашего файла 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 up с этой конфигурацией, Compose ищет переменную среды POSTGRES_VERSION в оболочке и подставляет ее значение в. В этом примере Compose разрешает образ в postgres: 9.3 перед запуском конфигурации.
Если переменная окружения не установлена, Compose подставляет пустую строку. В приведенном выше примере, если POSTGRES_VERSION не установлен, значение для параметра изображения - postgres :.
Поддерживаются оба синтаксиса $ VARIABLE и $ {VARIABLE}. Расширенные функции стиля оболочки, такие как $ {VARIABLE-default} и $ {VARIABLE / foo / bar}, не поддерживаются.
Если вам нужно поместить буквенный знак доллара в значение конфигурации, используйте двойной знак доллара ($$).
И я считаю, что эта функция была добавлена в этом запросе на получение доступа : https://github.com/docker/compose/pull/1765
Решение BASH:
Я заметил, что у людей есть проблемы с поддержкой переменных окружения Докера. Вместо того, чтобы иметь дело с переменными среды в 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 в вашем файле compose с обычным синтаксисом bash (то есть ${SECRET_KEY}
для вставки SECRET_KEY
из .env
файла).
Обратите внимание, что COMPOSE_CONFIG
это определено в моем .env
файле и используется в моем скрипте bash, но вы можете легко заменить {$COMPOSE_CONFIG}
его my-compose-file.yml
в скрипте bash.
Также обратите внимание, что я пометил это развертывание, назвав все свои контейнеры префиксом «myproject». Вы можете использовать любое имя, которое хотите, но оно помогает идентифицировать ваши контейнеры, чтобы вы могли легко ссылаться на них позже. Предполагая, что ваши контейнеры не имеют состояния, как и должно быть, этот сценарий быстро удалит и повторно развернет ваши контейнеры в соответствии с параметрами вашего файла .env и файлом составления YAML.
Обновление
Поскольку этот ответ кажется довольно популярным, я написал сообщение в блоге, в котором более подробно описывается мой рабочий процесс развертывания Docker: http://lukeswart.net/2016/03/lets-deploy-part-1/ Это может быть полезно при добавлении более сложная конфигурация развертывания, такая как конфиги nginx, сертификаты LetsEncrypt и связанные контейнеры.