Reactjs 无法在部署时获取kubectl环境变量

Reactjs 无法在部署时获取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

我有一个docker容器,其中设置了一些环境变量。我知道在一个典型的用例中,React无法读取这些变量,因为process.env变量在传输过程中被替换

我正在尝试解决这个问题,而不必使用名为react env的插件来启动后端服务器

其核心思想是创建一个.env文件,该文件可以使用bash脚本写入。bash脚本会将任何环境变量复制到.env文件中。该插件将生成一个env.js文件,然后React应用程序将在运行时使用该文件

Dockerfile

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
中的所有内容都会发生,因此您不能在构建阶段设置部署时间环境变量。