【问题标题】:How to pass variables to Reactjs through kubernetes如何通过 kubernetes 将变量传递给 Reactjs
【发布时间】: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


【解决方案1】:

你展示的js:

let url = process.env.REACT_APP_BACKEND_URL 
let port = process.env.REACT_APP_BACKEND_PORT

在用户的浏览器中运行,而不是在 kubernetes 或 docker 中,因此您在服务器上设置的环境变量在代码运行时不存在。 kubernetes/docker 容器仅将 javascript 作为文件提供给用户的浏览器。

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

【讨论】:

  • 这是对的,我猜是这个原因。
猜你喜欢
  • 2015-09-19
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 2017-01-10
  • 1970-01-01
  • 1970-01-01
  • 2018-08-05
相关资源
最近更新 更多