reactjs - 部署时无法获取 kubectl 环境变量

标签 reactjs docker kubernetes dockerfile

我有一个 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/

相关文章:

javascript - 如何在 React 中提交表单时进行多个 api 调用

javascript - 使用 lodash 并尝试使用多个对象更新和对象。 (编辑项目)

docker - Phusion Passenger 和 Docker-Compose 权限问题

nginx - 获取请求者的源IP

javascript - redux - 如何存储和更新键/值对

javascript - Ant-Design 表单验证在使用 onChange 时返回旧值

docker - 构建docker镜像时如何访问父主机服务?

docker - 无法使用Docker容器连接到Oracle数据库

kubernetes - 如何将 Pod 移动到新的节点池/实例组

docker - 启动 minikube 时无法设置 kubeconfig