И мои продукты сочиняют:

аюсь создать контейнер для веб-приложения внешнего интерфейса, и у меня возникают проблемы с выяснением того, как передавать переменные среды. Приложение является угловым, поэтому оно на 100% на стороне клиента.

В типичном бэкэнд-сервисе передача переменных среды проста, поскольку все работает на одном хосте, поэтому бэкэнд-сервис может легко выбрать переменные среды. Однако в веб-приложении все иначе: приложение работает в браузере клиента.

Я хочу настроить свое приложение с помощью переменных среды, поскольку это значительно упрощает развертывание. Все настройки могут быть выполнены вdocker-compose.yml и нет необходимости поддерживать несколько изображений, по одному для каждой возможной среды. Есть только одно неизменное изображение. Это следует философии применения 12-фактора, как можно найти наhttps://12factor.net/config.

Я создаю свой образ приложения следующим образом:

FROM node:alpine as builder
COPY package.json ./
RUN npm i && mkdir /app && cp -R ./node_modules ./app
WORKDIR /app
COPY . .
RUN $(npm bin)/ng build

FROM nginx:alpine
COPY nginx/default.conf /etc/nginx/conf.d/
RUN rm ,-rf /usr/share/nginx/html/*
COPY --from=builder /app/dist /usr/share/nginx/html
CMD ["nginx", "-g", "daemon off;"]

Вapp/config.ts, У меня есть:

export const config = {
    REST_API_URL: 'http://default-url-to-my-backend-rest-api'
};

В идеале я хочу сделать что-то подобное в моемdocker-compose.yml:

backend:
  image: ...
frontend:
  image: my-frontend-app
  environment:
    - REST_API_URL=http://backend:8080/api

Поэтому я считаю, что я должен изменить этоapp/config.ts заменитьREST_API_URL с переменной среды. Поскольку я предпочитаю неизменный образ Docker (поэтому я не хочу делать это вместо во время сборки), я совершенно озадачен тем, как здесь продвигаться. Я считаю, что я должен поддержать, чтобы изменитьapp/config.ts во время выполнения до запуска прокси nginx. Однако тот факт, что этот файл минимизирован и упакован в веб-пакет, делает его более сложным.

Есть идеи, как справиться с этим?

Ответы на вопрос(4)

Ваш ответ на вопрос