Как я могу передать переменные, которые я поместил в файл .env, в контейнеры в моем рое докеров?

Я пытаюсь использовать одни и те же файлы docker-compose.yml и .env как для docker-compose, так и для swarm. Переменные из файла .env должны быть проанализированы через sed в файл конфигурации, запустив скрипт run.sh при загрузке. Эта настройка отлично работает при использовании команды docker-compose up, но они не передаются, когда я использую команду docker stack deploy.

Как я могу передать переменные в контейнер, чтобы скрипт run.sh анализировал их при загрузке?


person Shōgun8    schedule 01.11.2019    source источник
comment
Пожалуйста, поделитесь файлами docker-compose и полными командами, которые работают или не работают для вас. Что вы подразумеваете под разбором env. вары? Вы имеете в виду использование их значений?   -  person rok    schedule 02.11.2019
comment
Использование файлов .env для разбора переменных является де-факто способом работы с переменными. Объяснение того, что такое синтаксический анализ и переменные, выходит за рамки этого вопроса. Нет необходимости обмениваться файлами, так как это вопрос высокого уровня, так как это только запутает воду.   -  person Shōgun8    schedule 06.11.2019


Ответы (3)


Загрузка файла .env — это функция docker-compose, которая не является частью интерфейса командной строки docker. Вы можете вручную загрузить содержимое этого файла в свою оболочку перед выполнением развертывания:

set -a; . ./.env; set +a
docker stack deploy -c docker-compose.yml stack_name

Другие варианты включают использование docker-compose для предварительной обработки файла компоновки:

docker-compose config >docker-compose.processed.yml

Или вы можете использовать envsubst для замены переменных, чтобы создать компоновочный файл с уже развернутыми переменными:

set -a; . ./.env; set +a
envsubst <docker-compose.yml >docker-compose.processed.yml
person BMitch    schedule 02.11.2019
comment
Я не уверен, что это относится к компоненту роя докеров. - person Shōgun8; 16.03.2020
comment
Первый вариант @Octavian создает env и развертывает его с помощью swarm. Второй и третий варианты создают компоновочный файл, который вы можете развернуть с помощью swarm. docker stack — это команда режима роя, а файл compose yml — входные данные для этой команды. - person BMitch; 16.03.2020
comment
Это кажется правильным ответом, но я не могу понять, что такое docker-compose.processed.yml. - person logicOnAbstractions; 30.09.2020
comment
Обработанный файл представляет собой компоновочный файл с развернутыми переменными. Вы развертываете это, поскольку режим роя не просматривает файл .env при развертывании стека с файлом компоновки. - person BMitch; 30.09.2020

Чтобы передать переменные среды оболочки в контейнеры, используйте синтаксис env_file:

web:
  env_file:
    - web-variables.env

Согласно документам:

Вы можете передать несколько переменных среды из внешнего файла в контейнеры службы с помощью параметра «env_file».

Однако использование .env в качестве внешнего имени файла может привести к неожиданным результатам и проблематично с точки зрения семантики.

Размещение .env в папке, где команда docker-compose служит другой цели:

Как документы, Docs2, Docs3 состояние:

Определенные здесь переменные среды используются для подстановки переменных в файле Compose.

Вы можете установить значения по умолчанию для переменных среды, используя файл .env, который Compose автоматически ищет.

Итак, если файл компоновки содержит:

db:
  image: "postgres:${POSTGRES_VERSION}"

Вы .env будете содержать:

POSTGRES_VERSION=4.0

Эта функция действительно работает только в композиции:

Функция файла .env работает только при использовании команды docker-compose up и не работает с развертыванием стека docker.

person rok    schedule 09.11.2019
comment
Спасибо за приукрашивание, но я считаю, что суть всего этого заключается в том, что docker-compose автоматически ищет файл .env, а docker stack нет; это должно быть указано в файле yaml с помощью env_file:. Мой ответ был правильным ответом; это точный ответ на мой первоначально заданный вопрос. - person Shōgun8; 13.11.2019

На самом деле я обнаружил, что лучший/самый простой способ — просто добавить этот аргумент в файл docker-compose.yml:

env_file:
  - .env 
person Shōgun8    schedule 04.11.2019
comment
Обратите внимание, что это поведение отличается от поведения файла .env, который расширяет переменные внутри самого файла компоновки yaml. Он будет внедрять переменные в среду развертываемого контейнера. Файл компоновки и развернутый контейнер — это две разные среды. - person BMitch; 16.03.2020