【问题标题】:Cannot get kubectl environment variables on deploy部署时无法获取 kubectl 环境变量
【发布时间】:2019-10-08 20:22:19
【问题描述】:

我有一个带有一些环境变量设置的 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 文件中?

【问题讨论】:

  • The first question you asked in this series 描述了一个应该工作的基于入口点的解决方案;你还在为此烦恼吗? Dockerfile 中的所有内容都发生在您的 Kubernetes 设置中的任何内容被考虑之前,因此您无法在构建阶段设置部署时环境变量。

标签: reactjs docker kubernetes dockerfile


【解决方案1】:

看起来 $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 本身可以访问该环境变量。您可以使用--build-arg 参数执行此操作,例如:

docker build --build-arg GCP_PROJECT_ID=[correct value] .

在这种情况下,您需要在 Dockerfile 中添加一个参数命令,如下所示:

ARG GCP_PROJECT_ID

在 RUN 命令之前的某个时间点。

【讨论】:

    猜你喜欢
    • 2021-12-23
    • 2019-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多