Node.js 如何通过kubernetes将变量传递给Reactjs

Node.js 如何通过kubernetes将变量传递给Reactjs,node.js,reactjs,docker,kubernetes,Node.js,Reactjs,Docker,Kubernetes,我有一个简单的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

我有一个简单的
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          

let url = process.env.REACT_APP_BACKEND_URL 
let port = process.env.REACT_APP_BACKEND_PORT
我使用
NodeJs
访问这些变量,如下所示:

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          

let url = process.env.REACT_APP_BACKEND_URL 
let port = process.env.REACT_APP_BACKEND_PORT
但是如何修改上面提到的
Dockerfile
来传递这两个变量呢?

您显示的js:

let url=process.env.REACT\u APP\u BACKEND\u url
让端口=process.env.REACT\u APP\u BACKEND\u端口
在用户浏览器中运行,而不是在kubernetes或docker中运行,因此在运行代码时,服务器上设置的环境变量不存在。kubernetes/docker容器仅将javascript作为文件提供给用户的浏览器


基本上,您不能以这种方式使用环境变量。

我对NodeJs生态系统不太熟悉,但是如果
process.env…
可以直接访问系统变量,您应该都设置好了。@Turing85您不认为我们需要通过
Dockerfile
或其他任何方式来传递它吗?不。如果我们用
docker run…
启动容器,我们可以使用选项
-e…
来设置环境变量(例如
docker run-e keydove\u USER=keydove-e keydove\u PASSWORD=keydove jboss/keydove
)。kubernetes在定义环境变量时使用了相同的机制。微服务的整个思想是将应用程序与其配置分离。运行时必须传递环境变量等配置值。您可以在代码中为某些变量指定默认值,但可以使用env变量覆盖它们。您的前端(所有javascript)不会在node、docker或kubernetes中运行,而是在用户机器上的浏览器中运行,该用户机器远离您的服务器,并具有自己独特的环境。没有直接的方法将这些环境变量传递到您的代码中,除了在提供代码之前重写代码(即,将代码作为模板编写,构建系统使用这些变量重写),或者通过rest API提供这些值,您必须单独编写。这是正确的,我想这就是原因。