我有一个 docker 容器,设置了一些环境变量。我知道在典型的用例中,React 无法读取这些变量,因为 process.env 变量在转译期间被替换。
我正在尝试解决这个问题,而不必使用名为react-env的插件来启动后端服务器。
核心思想是创建一个可以使用 bash 脚本写入的 .env 文件。 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" ]
docker-entrypoint.sh
serve build
App.jsx
...
console.log(env("GCP_PROJECT_ID"));
...
检查控制台
'' //Empty string.
但是,制作镜像并部署应用程序后,控制台输出环境变量的空字符串。
手动exec
进入并正确运行echo
命令确实有效:
手动查询:
# echo 'REACT_APP_GCP_PROJECT_ID='$GCP_PROJECT_ID
REACT_APP_GCP_PROJECT_ID=SOME_VALUE
但是
# cat .env
REACT_APP_SETUP="OK"
REACT_APP_GCP_PROJECT_ID=
如何在 React 运行之前将 pod 环境变量放入 .env
文件中?
最佳答案
看起来 $GCP_PROJECT_ID 未在构建环境中定义,因此在构建时运行时它不包含在 echo 命令中。 (我认为这是因为您让 kubectl 定义了它)。
假设您期望 $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 中,如下所示(而不是被解释为空字符串!):
RUN echo 'REACT_APP_GCP_PROJECT_ID=$GCP_PROJECT_ID' >> /usr/app/.env
当然,如果您需要将 $GCP_PROJECT_ID 的值包含在 .env 文件中,则唯一的选择可能是在容器执行开始时实际对 .env 进行回显(例如位于 docker-entrypoint.sh 顶部,并从 Dockerfile 中删除所有相关代码)。
如果我错误地认为您在进程启动时让 kubectl 定义它,则替代解决方案将要求您确保 docker 构建本身可以访问该环境变量。您可以使用 --build-arg
参数来执行此操作,例如:
docker build --build-arg GCP_PROJECT_ID=[correct value] .
在这种情况下,您需要向 Dockerfile 添加一个参数命令,如下所示:
ARG GCP_PROJECT_ID
在 RUN 命令之前的某个时刻。
关于reactjs - 部署时无法获取 kubectl 环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58293584/