我正在尝试将前端 Web 应用程序容器化,但在弄清楚如何传递环境变量时遇到了麻烦。该应用程序是一个 Angular 应用程序,因此它是 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 映像(所以我不想在构建期间进行此替换),我很困惑如何在这里取得进展。我相信我应该支持在启动 nginx 代理之前更改app/config.ts
运行时。然而,这个文件被缩小和 webpack 捆绑的事实使得这更加困难。
任何想法如何解决这个问题?