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

时间:2019-10-21 10:42:29

标签: javascript reactjs docker npm webpack

我不确定自己在做什么错。 console.log显示undefinedMakefileconfig.envwebpack.config.jspackage.json都位于项目的根目录。

Makefile:

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

config.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)
        })
    ]

App.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"
    },

1 个答案:

答案 0 :(得分:0)

我在这里看到的一个错误是,您正在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 variableproduction。。

在构建后在服务器上设置任何环境变量都不会影响编译的文件

而且由于在已编译的代码中直接注入了env变量,因此您不应使用它来存储机密信息(秘密/专用令牌,密码,内部服务器的IP地址等)。 < / p>

因此,您最初的问题的解决方案可能是在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 repo。

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