Я хотел бы иметь возможность использовать переменные env внутри docker-compose.yml со значениями, переданными во время docker-compose up. Это пример. Я делаю это сегодня с помощью базовой команды запуска Docker, которая обернута вокруг моего собственного сценария. Есть ли способ добиться этого с помощью compose, без каких-либо оболочек для bash?
proxy:
hostname: $hostname
volumes:
- /mnt/data/logs/$hostname:/logs
- /mnt/data/$hostname:/data
docker
docker-compose
Дмитрий з
источник
источник
Ответы:
template.yml
, которое является вашимdocker-compose.yml
с переменным окружением.docker-compose.yml
Будет создан новый файл с правильными значениями переменных среды.Пример файла template.yml:
Пример файла env.sh:
источник
Решение DOCKER:
Похоже, что docker-compose 1.5+ включил подстановку переменных: https://github.com/docker/compose/releases
Последняя версия Docker Compose позволяет получить доступ к переменным окружения из вашего файла compose. Таким образом, вы можете получить исходные переменные окружения, а затем запустить Compose следующим образом:
Затем вы можете ссылаться на переменные в docker-compose.yml, используя $ {VARIABLE}, вот так:
А вот дополнительная информация из документов, взятых здесь: https://docs.docker.com/compose/compose-file/#variable-substitution
И я считаю, что эта функция была добавлена в этом запросе на получение доступа : https://github.com/docker/compose/pull/1765
Решение BASH:
Я заметил, что у людей есть проблемы с поддержкой переменных окружения Докера. Вместо того, чтобы иметь дело с переменными среды в Docker, давайте вернемся к основам, таким как bash! Вот более гибкий метод, использующий скрипт bash и
.env
файл.Пример файла .env:
затем запустите скрипт bash в той же директории, которая должна правильно развернуть все:
Просто укажите ваши переменные 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 и связанные контейнеры.
источник
grep foo file.text
вместоcat file.text | grep foo
. В моем случае мне пришлосьexport $(grep "^[^#]" .config | xargs) && cat docker-compose.yml | envsubst
.docker-compose up
а не сdocker-compose run
..env
подenv_file
. Затем вы можете ссылаться на переменные вdocker-compose.yml
использовании${VARIABLE}
Кажется, что docker-compose теперь имеет встроенную поддержку переменных среды по умолчанию в файле .
все, что вам нужно сделать, это объявить ваши переменные в файле с именем,
.env
и они будут доступны в docker-compose.yml.Например, для
.env
файла с содержимым:Вы можете получить доступ к вашей переменной внутри
docker-compose.yml
или переслать их в контейнер:источник
.env
, напримерconfig.env
, у меня не сработало.Следующее применимо для docker-compose 3.x Установка переменных среды внутри контейнера
Создайте файл .env в том же месте, что и docker-compose.yml.
и ваш составной файл будет как
источник
источник
При использовании переменных среды для томов вам необходимо:
создать файл .env в той же папке, в которой находится
docker-compose.yaml
файлобъявить переменную в
.env
файле:Изменение
$hostname
в${HOSTNAME}
вdocker-compose.yaml
файлеКонечно, вы можете сделать это динамически на каждой сборке, например:
источник
The .env file feature only works when you use the docker-compose up command and does not work with docker stack deploy.
Лучший способ - указать переменные окружения вне
docker-compose.yml
файла. Вы можете использоватьenv_file
настройки и определить свой файл среды в той же строке. Затем повторное создание docker должно воссоздать контейнеры с новыми переменными среды.Вот как выглядит мой docker-compose.yml:
источник
Вы не можете ... пока. Но это альтернатива, подумайте как генератор docker-composer.yml:
https://gist.github.com/Vad1mo/9ab63f28239515d4dafd
В основном сценарий оболочки, который заменит ваши переменные. Также вы можете использовать задачу Grunt для создания файла компоновки Docker в конце процесса CI.
источник
У меня есть простой сценарий bash, который я создал для этого, это просто означает, что нужно запустить его в вашем файле перед использованием: https://github.com/antonosmond/subber
По сути, просто создайте свой файл compose, используя двойные фигурные скобки для обозначения переменных среды, например:
Все, что находится в двойных фигурных скобках, будет заменено переменной среды с тем же именем, поэтому, если бы у меня были установлены следующие переменные среды:
при запуске
subber docker-compose.yml
полученный файл будет выглядеть так:источник
Насколько я знаю, это незавершенное производство. Они хотят сделать это, но это еще не выпущено. См. 1377 («новый» 495 , упомянутый @Andy).
В итоге я реализовал подход «генерировать .yml как часть CI», предложенный @Thomas.
источник
добавить env в файл .env
Такие как
затем сохраните его в
deploy.sh
источник
Используйте файл .env для определения динамических значений в docker-compse.yml. Будь то порт или любое другое значение.
Пример docker-compose:
Внутри .env файла вы можете определить значение этих переменных:
источник
Используйте версию 3.6:
Я получил это по этой ссылке https://github.com/docker/cli/issues/939
источник
Начиная с версии 1.25.4, docker-compose поддерживает опцию,
--env-file
которая позволяет вам указывать файл, содержащий переменные.Ваш должен выглядеть так:
И команда:
источник