Переменные окружения для Angular приложения

Вдохновление Immutable Web Apps

Речь о контейнеризированном приложении

FROM nginx:1.19
LABEL maintainer="admin@tyapk.ru"
COPY /dist/apps/tyapk /usr/share/nginx/html
RUN sed -i '/^}/i \ \ \ \ error_page  404 /index.html;' /etc/nginx/conf.d/default.conf

Option 1

Значения-заменители создаются в environment.prod.ts файле окружения.

export const environment = {
  production: true,
  apiUrl: '__API_URL__',  // <== __API_URL__ будет заменено на реальное значение
};

Option 2

В приложении имеется index.html, который не кэшируется. В нем создаётся глобальная константа __env со значениями заменителями.

<body>
    <script>
        // именно var, не const
        var __env = {
            API_URL: '__API_URL__',
            GA: '__GA__',
        }
    </script>  
    <div id="root"></div>
    <!-- spa scripts -->
    <script src="dist/bundle.js"></script>
    ...

Из переменной __env читаются значения в environment.prod.ts файл

export const environment = {
  production: true,
  apiUrl: (window as any).__env.API_URL,
  gaCode: (window as any).__env.GA,
};

Option 2 позволяет легко править значения в runtime. Вместо простого файла можно сделать сервис

Далее необходимо создать скрипт, который перед запуском приложения или во время deploy будет заменять заглушки на реальные значения т.е. вместо __API_URL__ появится https://api.awesome.app.

В простом случае можно использовать sed

docker-entrypoint.sh

#!/usr/bin/env bash
set -Eeo pipefail
sed -i "s|__API_URL__|${API_URL}|"  /usr/share/nginx/html/index.html
exec "$@"

В Dockerfile добавлется копирование сценария и его запуск при старте контейнера.

FROM nginx:1.19
LABEL maintainer="admin@tyapk.ru"
COPY /dist/href-deploy /usr/share/nginx/html
RUN sed -i '/^}/i \ \ \ \ error_page  404 /index.html;' /etc/nginx/conf.d/default.conf
COPY docker-entrypoint.sh /
RUN chmod +x docker-entrypoint.sh
ENTRYPOINT ["/docker-entrypoint.sh"]
CMD ["nginx", "-g", "daemon off;"]

Напоминание про ENTRYPOINT vs CMD

docker build -t tyapk/href .
docker run -p 8080:80 -e API_URL=vasya tyapk/href

Альтернативно использовать envsubst в docker-entrypoint.sh, чтобы заменить все переменные. Для этого надо создать файл шаблон index.env.html

    <script>
      var __env = {
        API_URL: "${API_URL}",
        GA: "${GA}",
        ENV3: "${ENV3}",
        ENV4: "${ENV4}",
        ENV5: "${ENV5}",
      };
    </script>

И вызывать команду envsubst < "src/index.env.html" > "src/index.html".


Похожие записи

Кратко о внедрение зависимостей и сервис контейнере

Cтатья о том, что такое "Внедрение зависимостей" и "Сервис-контейнер" отталкиваясь от их реализации в PHP фреймворках. Статья написана по мотивам статей Фабьена Потенсье, ведущиго разработчика и идеолога фреймворка Symfony, а также документации фреймворка Laravel.

@Attribute() декоратор

Аналогично @Input() позволяет получить значение атрибута с хоста компонента/директивы, но не отслеживает дальнейшее изменение атрибута.

14 сентября 2019 г. в Angular

Angular. Manually retry http request

На память. Некоторое время назад я решил достаточно необычную задачу, но в последствии на backend`е переделали логику и код был удалён из проекта.

Angular Resolver

Resolver гарантированно получает асинхронные данные до создания компонента исходя из параметров маршрута.