【发布时间】:2021-08-05 10:22:48
【问题描述】:
我有一个简单的reactjs 应用程序,我将把它部署到我的kubernetes 集群中。
reactjs 应用程序的Dockerfile 如下所示:
# build env
FROM node:13.12.0-alpine as build
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . ./
RUN npm run build
# production env
FROM nginx:stable-alpine
COPY --from=build /app/build /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
我想通过kubernetes 传递两个环境变量,如下所示:
apiVersion: apps/v1
kind: Deployment
metadata:
name: frontend
spec:
selector:
matchLabels:
app: frontend
replicas: 1
template:
metadata:
labels:
app: frontend
spec:
containers:
- name: frontend
image: 19950818/k8s:frontend
imagePullPolicy: Always
ports:
- containerPort: 80
env:
- name: REACT_APP_BACKEND_URL
valueFrom:
configMapKeyRef:
name: backend-configs
key: backend.url
- name: REACT_APP_BACKEND_PORT
valueFrom:
configMapKeyRef:
name: backend-configs
key: backend.port
我正在使用NodeJs 访问这些变量,如下所示:
let url = process.env.REACT_APP_BACKEND_URL
let port = process.env.REACT_APP_BACKEND_PORT
但是如何修改上面提到的Dockerfile 来传递这两个变量呢?
【问题讨论】:
-
我对NodeJs生态不太熟悉,但是如果
process.env...可以直接访问系统变量,那你应该已经准备好了。 -
@Turing85 你不认为我们需要通过
Dockerfile或其他任何东西吗? -
不。如果我们以
docker run ...启动容器,我们可以使用选项-e ...来设置环境变量(例如docker run -e KEYCLOAK_USER=keycloak -e KEYCLOAK_PASSWORD=keycloak jboss/keycloak)。定义环境变量时,kubernetes 使用相同的机制。 -
微服务的整个理念是将应用程序与其配置解耦。环境变量等配置值必须在运行时传递。您可以在代码中为某些变量指定默认值,但保留使用 env 变量覆盖它们的可能性。
-
您的前端(所有您的 javascript)不在节点、docker 或 kubernetes 中运行,它在远离您的服务器的用户机器上的浏览器中运行,具有自己独特的环境。没有直接的方法可以将这些环境变量传递到您的代码中,除了在提供代码之前重写代码——即将代码编写为构建系统用这些变量重写的模板——或者通过休息来提供这些值您必须单独编写的 API。
标签: node.js reactjs docker kubernetes