【问题标题】:Accesing nodejs process.env variables in CRA prod build in containerized Kubernetes deployment在容器化 Kubernetes 部署中访问 CRA prod 中的节点 js process.env 变量
【发布时间】:2019-01-27 19:23:52
【问题描述】:

我从CRA 创建了一个production build,其中有一个连接字符串
当试图通过service 将其导入 kubernetes 时,我是这样设置的:

CRA 的缩小版 prod ready 翻译成这个

"http://"+Object({NODE_ENV:"production",PUBLIC_URL:""}).APISERVER_SERVICE_HOST+":"+Object({NODE_ENV:"production",PUBLIC_URL:""}).APISERVER_SERVICE_PORT

process.env 没有任何容器 ENV。
难道是构建只是在构建时“烘焙”了环境变量,这就是客户端在 pod 中将它们视为字符串而不是键/值的原因?

目标是在部署 pod 后通过 process.env.VARIABLE_NAME 访问 api url 利用容器内的 env 变量

问题是,当它被部署时,uri 是未定义的 ,这意味着代码无法将 proccess.env.VARIABLE 转换/检测/翻译为其值
甚至console.log(process.env) 也会返回undefined

如果我进入 pod/container 并检查 env 变量,它们工作正常

为什么我没有在我的构建中获取环境变量的值?
我必须在特定时间构建它吗?
我错过了什么?

Dockerfile

FROM node:10 as build-deps
RUN mkdir /usr/src/app
WORKDIR /usr/src/app
ENV PATH /usr/src/app/node_modules/.bin:$PATH
COPY package.json /usr/src/app/package.json
RUN npm install --silent
RUN npm install react-scripts -g --silent
COPY . /usr/src/app
RUN npm run build
RUN echo $APISERVER_SERVICE_HOST

FROM nginx:1.12-alpine
RUN  apk update && apk add nodejs 
RUN rm -rf /etc/nginx/conf.d
COPY conf /etc/nginx 
COPY --from=build-deps /usr/src/app/build /usr/share/nginx/html
RUN echo $APISERVER_SERVICE_HOST
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

服务和部署 kubernetes

#Service for readable
apiVersion: v1
kind: Service
metadata:
  creationTimestamp: null
  labels:
    run: readable-deployment
  name: readable
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    run: readable-deployment
  type: LoadBalancer
status:
  loadBalancer: {}  


---
#Deployment for Readable
apiVersion: apps/v1beta1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    run: readable-deployment
  name: readable-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      run: readable-deployment
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        run: readable-deployment
    spec:
      containers:
      - image: gcr.io/kuberneteseval/readable:latest-01
        name: readable-deployment
        ports:
        - containerPort: 80
        resources: {}
status: {}

【问题讨论】:

  • 发布您的 Docker 文件的实际文本,以便更好地帮助您。
  • @RobertMoskal 感谢您的评论.. 什么文字?当我运行 docker images API 和 CLIENT 都可以正常工作,即使没有修改 URL 字符串,问题是在部署到 kubernetes 时
  • 除非您使用 --build-arg 进行设置,否则您不会在构建时看到该环境变量。
  • 像其他人一样输入 docker 文件内容作为引用文本! kubernetes 让你设置环境变量。
  • 你一直在谈论在浏览器中获取这些环境变量??!!!

标签: docker kubernetes environment-variables create-react-app production-environment


【解决方案1】:

首先,这是一个create-react-app生产build

截至今天 Aug 24 2018 仍然有一个 open issue 用于此以及应该如何完成。

无论我做什么,API url 始终是一个“key string”,而不是 env 变量的值。

我做了什么:(只是一种解决方法,不在运行时获取服务变量)

  • 我创建了.env.production 文件并添加了REACT_APP_SERVICE_HOST 和REACT_APP_SERVICE_PORT
    这样做的问题是,在我的本地机器上的 docker build 时,无法获取集群服务变量的值,因此您必须手动设置这些值。像这样:REACT_APP_APISERVER_SERVICE_HOST=35.15.5.0和REACT_APP_APISERVER_SERVICE_PORT=3008

其他选择:

  • 我尝试this 显然它确实获取了服务变量。无法让它为我工作
  • 我还尝试了 Ejecting 并使用 Environment plugin,它是 CRA 使用的 define Plugin 的简写,但同样您在构建时无法访问服务变量...李>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-23
    • 2021-08-12
    • 2021-01-29
    • 2016-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-30
    相关资源
    最近更新 更多