在容器化的Kubernetes部署中构建CRA prod中的nodejs process.env变量

时间:2018-08-21 14:57:22

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

我从production build创建了一个CRA,其中有一个连接字符串conn string original
当尝试通过service将其放入kubernetes时,我是以这种方式设置的:
connstring translated
准备好CRA的精简版prod将此翻译为
enter image description here

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

process.env没有任何容器ENV。
难道是因为该构建只是在构建时“嵌入”了env变量,这就是客户端将它们视为字符串而不是位于吊舱中的键/值的原因吗?

目标是在容器部署完毕后,通过process.env.VARIABLE_NAME在容器中使用 env 变量来访问 api网址

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

如果我进入吊舱/容器并检查env变量,它们是否工作正常 container ENV variables
env variables via node and shell

为什么我的构建中没有得到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: {}

1 个答案:

答案 0 :(得分:0)

首先,这是针对create-react-app生产build

截至Aug 24 2018为止,还有open issue用于此操作以及应如何进行。

无论我做什么,API URL始终都是“ 密钥字符串”,而不是 env 变量的值。

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

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

其他替代方法:

  • 我尝试了this,显然它确实捕获了服务变量。无法为我工作
  • 我还尝试了Ejecting并使用Environment plugin,它是CRA使用的 define插件的简写,但是您再次无法在构建时访问服务变量...