Подводя итог, мой проект состоит из:
- / докер-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
), тогда остальная часть процесса сборки будет в порядке, и приложение внешнего интерфейса получит эти значения.