Как изменить эффект команды запуска Dockerfile на основе переменной среды, переданной из docker-compose.yml - PullRequest
0 голосов
/ 06 мая 2018

Подводя итог, мой проект состоит из:

  • / докер-compose.yml
  • / backend / Dockerfile (файл Docker для службы "backend", API REST Yii2)
  • / backend / .env (не версия)
  • / frontend / Dockerfile (файл Docker для службы "frontend", приложение Angular2)
  • / внешний интерфейс / .env (не версия)

Итак, 2 службы, которые объявлены в основном docker-compose.yml, и у каждого из них есть свой (не версионный) файл .env, где я объявляю «специфичные для среды» параметры, специфичные для данной службы. Например. для бэкэнда я определяю имя пользователя / пароль БД; для службы веб-интерфейса я объявляю URL-адрес REST API, с которого веб-интерфейс должен получать свои данные через Ajax.

Я передаю /backend/.env в бэкэнд-сервис и /frontend/.env в сервис веб-интерфейса через основной docker-compose.yml, используя параметр env_file.

Обе службы размещены в разных доменах (example.com и api.example.com).

Учитывая то, как Angular 2 обрабатывает свою конфигурацию, вы не можете объявлять переменные среды уровня ОС и позволять Angular использовать их во время выполнения внутри приложения (например, для чтения «BACKEND_URL» из переменной env и выполнения Ajax-вызовов к ней). Вместо этого он ожидает, что все параметры среды будут присутствовать во время процесса сборки в файле /src/app/environment.prod.ts. Мне удалось создать этот файл конфигурации с помощью команды RUN в / frontend / Dockerfile, но я борюсь с тем, чтобы заполнить его динамическими значениями, объявленными в неверсионном /frontend/.env. Я не хочу жестко кодировать вещи в /frontend/Dockerfile.

Как только / frontend / Dockerfile сгенерирует статический /src/app/environment.prod.ts с правильными значениями (например, BACKEND_URL=http://api.example.com), тогда остальная часть процесса сборки будет в порядке, и приложение внешнего интерфейса получит эти значения.

1 Ответ

0 голосов
/ 06 мая 2018

Проблема, как вы уже указали, заключается в том, что объявления среды / env_file в docker compose применяются к RUN, а не к build. Чтобы передать параметры через docker-compose в сборку docker, вам нужно будет указать ARGS в вашем Dockerfile, как описано здесь . Затем вы можете передать предопределенные аргументы из вашего файла композиции, как показано здесь .

Однако я чувствую, что этот подход вводит слишком много взаимосвязей и повторных объявлений. Я более склонен к тому, чтобы вы разделяли определения среды в отдельные файлы.

В дополнение к тому, что у вас уже есть, вам нужно только определить сценарий оболочки точки входа для соответствующих контейнеров, которые способны принимать переменные среды и генерировать угловые привязки среды environment.prod.ts до запуска приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...