我有一个带有一些环境变量设置的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" ]
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
文件中?
答案 0 :(得分:2)
在构建环境中似乎未定义$ GCP_PROJECT_ID,因此在构建时运行时,它不包含在echo命令中。 (我想这是因为您要用kubectl对其进行定义)。
假设您希望$ GCP_PROJECT_ID在构建环境中不存在,而是在容器执行时尝试复制的内容(如exec示例所示),那么您的问题是引用了RUN线
RUN echo 'REACT_APP_GCP_PROJECT_ID='$GCP_PROJECT_ID >> /usr/app/.env
在构建期间正在解释$ GCP_PROJECT_ID,这当然是空字符串。在容器内的外壳中进行的测试中,似乎$ 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命令之前的某个时刻。