Я пытаюсь контейнеризовать внешнее веб-приложение, и у меня возникают проблемы, чтобы выяснить, как передавать переменные среды. Приложение является угловым приложением, поэтому оно на 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
на переменную среды. Поскольку я предпочитаю неизменяемое изображение Докера (поэтому я не хочу, чтобы это заменялось во время сборки), я очень озадачен тем, как продвигаться здесь. Я считаю, что должен поддерживать изменение app/config.ts
во время выполнения до запуска прокси-сервера nginx. Тем не менее, тот факт, что этот файл миниатюрный и пакетный пакет, делает это более сложным.
Любые идеи, как справиться с этим?