繁体   English   中英

无法使用 webpack DefinePlugin 在 React 应用程序中从 dockerfile 访问环境变量

[英]Unable to access env variables from dockerfile in React app using webpack DefinePlugin

我不确定我做错了什么。 console.log 打印undefined Makefileconfig.envwebpack.config.jspackage.json项目的根目录都是 7.7

Makefile:

docker-run: docker
    docker run -it --env-file config.env -p "80:80" app

配置.env

API_KEY=https://test.com

webpack.config.js

plugins: [
        new webpack.DefinePlugin({
            BASE_URL: JSON.stringify('https://myapp.firebaseio.com'),
            'process.env.API_KEY': JSON.stringify(process.env.API_KEY)
        })
    ]

应用程序.js

const App = () => {
    useEffect(() => {
        console.log(process.env.API_KEY);//undefined
        console.log(process.env.BASE_URL);//undefined
        console.log(BASE_URL);//undefined
    }, []);
    return (
        <></>
    );
};

Package.json( npm run docker )

"scripts": {
        "start": "rm -rf dist && webpack-dev-server --mode development --open --hot --port 8090",
        "docker": "rm -rf dist && webpack --mode production && make docker-run"
    },

我在这里看到的一个错误是,您正在 docker 之外构建项目并将工件(构建后)推送到 docker 以服务于 webapp。

根据DefinePlugin https://webpack.js.org/plugins/define-plugin/的文档

DefinePlugin 允许您创建可以在编译时配置的全局常量

这意味着,如果您有如下所示的App.js组件

import React from 'react';

function App() {
  return (
    <div>
        <p>[process.env.test] = {process.env.test}</p>
        <p>[process.env.NODE_ENV] = {process.env.NODE_ENV}</p>

    </div>
  );
}

export default App;

和 webpack 配置

new webpack.DefinePlugin({"process.env.test": JSON.stringify(process.env.test)})

运行NODE_ENV=production test="A test variable" npm run build (如果使用 create-react-app 引导,则内部运行webpack --mode production

该组件被编译为(仅粘贴 webpack 编译代码的相关部分)。

 var i = function() {
        return a.a.createElement(
          "div",
          null,
          a.a.createElement(
            "p",
            null,
            "[process.env.test] = ",
            "A test variable"
          ),
          a.a.createElement(
            "p",
            null,
            "[process.env.NODE_ENV] = ",
            "production"
          )
        );
      }

在这里,它将{process.env.test}{process.env.NODE_ENV}替换为A test variable and production at compile time

构建后在服务器上设置任何环境变量对编译文件没有影响

并且由于在编译代码中直接注入环境变量,您不应该使用它来存储机密信息(秘密/私人令牌、密码、内部服务器的 IP 地址等)。

因此,您最初问题的解决方案可能是在 docker 容器内构建工件。 下面是一个示例 Docker 文件。

FROM node:10 as react-app
# Create app directory
WORKDIR /usr/src/app
# Set a temporary variable
ENV test="Hello Docker"
COPY . .
RUN npm install
RUN npm run build

FROM nginx:1.12-alpine
COPY --from=react-app /usr/src/app/build /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]  

如果您需要参考,请提供示例 git 存储库。

https://github.com/nithinthampi/test-defineplugin

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM