Reactjs 无法在部署时获取kubectl环境变量
我有一个docker容器,其中设置了一些环境变量。我知道在一个典型的用例中,React无法读取这些变量,因为process.env变量在传输过程中被替换 我正在尝试解决这个问题,而不必使用名为react env的插件来启动后端服务器 其核心思想是创建一个.env文件,该文件可以使用bash脚本写入。bash脚本会将任何环境变量复制到.env文件中。该插件将生成一个env.js文件,然后React应用程序将在运行时使用该文件 DockerfileReactjs 无法在部署时获取kubectl环境变量,reactjs,docker,kubernetes,dockerfile,Reactjs,Docker,Kubernetes,Dockerfile,我有一个docker容器,其中设置了一些环境变量。我知道在一个典型的用例中,React无法读取这些变量,因为process.env变量在传输过程中被替换 我正在尝试解决这个问题,而不必使用名为react env的插件来启动后端服务器 其核心思想是创建一个.env文件,该文件可以使用bash脚本写入。bash脚本会将任何环境变量复制到.env文件中。该插件将生成一个env.js文件,然后React应用程序将在运行时使用该文件 Dockerfile FROM node:9 # Install ya
FROM node:9
# Install yarn
RUN npm install yarn
# Install serve.js
RUN yarn global add serve
# Create app directory
WORKDIR /usr/app
# Copy all necessary files and grant permissions.
# - yarn.lock
# - package.json
# - .env
# - docker-entrypoint.sh
COPY . /usr/app/
COPY yarn.lock /usr/app
COPY package.json /usr/app
COPY .env /usr/app
COPY docker-entrypoint.sh /usr/app/docker-entrypoint.sh
RUN chmod 777 /usr/app/docker-entrypoint.sh
# Install dependencies.
RUN printf "\n" >> /usr/app/.env
RUN echo 'REACT_APP_GCP_PROJECT_ID='$GCP_PROJECT_ID >> /usr/app/.env //READ ENVIRONMENTAL VARIABLE HERE
RUN yarn
# Build application.
RUN yarn build
# Set entrypoint of application.
ENTRYPOINT [ "/usr/app/docker-entrypoint.sh" ]
'' //Empty string.
docker entrypoint.sh
serve build
App.jsx
...
console.log(env("GCP_PROJECT_ID"));
...
检查控制台
FROM node:9
# Install yarn
RUN npm install yarn
# Install serve.js
RUN yarn global add serve
# Create app directory
WORKDIR /usr/app
# Copy all necessary files and grant permissions.
# - yarn.lock
# - package.json
# - .env
# - docker-entrypoint.sh
COPY . /usr/app/
COPY yarn.lock /usr/app
COPY package.json /usr/app
COPY .env /usr/app
COPY docker-entrypoint.sh /usr/app/docker-entrypoint.sh
RUN chmod 777 /usr/app/docker-entrypoint.sh
# Install dependencies.
RUN printf "\n" >> /usr/app/.env
RUN echo 'REACT_APP_GCP_PROJECT_ID='$GCP_PROJECT_ID >> /usr/app/.env //READ ENVIRONMENTAL VARIABLE HERE
RUN yarn
# Build application.
RUN yarn build
# Set entrypoint of application.
ENTRYPOINT [ "/usr/app/docker-entrypoint.sh" ]
'' //Empty string.
但是,在生成映像并部署应用程序之后,控制台输出环境变量的空字符串
手动exec
进入,并正确运行echo
命令:
手动查询:
# echo 'REACT_APP_GCP_PROJECT_ID='$GCP_PROJECT_ID
REACT_APP_GCP_PROJECT_ID=SOME_VALUE
但是
如何在React运行之前将pod环境变量放入
.env
文件?看起来$GCP\u PROJECT\u ID未在构建环境中定义,因此在构建时运行时,它未包含在echo命令中。(我想这是因为你让库贝特来定义它)
假设生成环境中不存在$GCP_PROJECT_ID,而是在容器执行时试图从中复制的内容(如exec示例所示),那么问题在于引用运行行
RUN echo 'REACT_APP_GCP_PROJECT_ID='$GCP_PROJECT_ID >> /usr/app/.env
在构建期间解释$GCP_PROJECT_ID,这当然是空字符串。在容器内shell中的测试中,似乎$GCP_PROJECT_ID实际上存在于环境中,并且一切正常
您需要实际引用$GCP_PROJECT_ID变量才能将其包含到/usr/app/.env中,就像这样(而不是被解释为空字符串!):
当然,如果需要将$GCP_PROJECT_ID的值作为文本字符串包含在.env文件中,那么唯一的替代方法可能是在容器执行开始时将echo放入.env中(例如,在docker entrypoint.sh
的顶部,并从Dockerfile中删除所有相关代码)
如果在流程开始时让kubectl对其进行定义是错误的,那么另一种解决方案将要求您确保docker构建本身能够访问该环境变量。可以使用
--build arg
参数执行此操作,例如:
docker build --build-arg GCP_PROJECT_ID=[correct value] .
在这种情况下,您需要向Dockerfile添加一个参数命令,如下所示:
ARG GCP_PROJECT_ID
在运行命令之前的某个时间点。描述了一个基于入口点的解决方案,该解决方案应该可以工作;你在这方面还有困难吗?在考虑Kubernetes设置之前,Dockerfile
中的所有内容都会发生,因此您不能在构建阶段设置部署时间环境变量。