代码之家  ›  专栏  ›  技术社区  ›  jonnyg

如何在docker文件中获取我可用的docker环境变量?(使用React/JS/webpack)

  •  2
  • jonnyg  · 技术社区  · 7 年前

    dockerfile文件:

    ARG MY_VAR
    
    ENV NODE_ENV  production
    ENV MY_VAR $MY_VAR
    
    COPY . .
    
    RUN NODE_ENV=development npm install && \
        touch ./.env && \
        eval env > ./.env && \
        npm run build && \
        npm prune --production
    

    Docker newb在这里

    在我的容器中,我运行 env 命令并查看我设置的变量,在运行节点控制台时也可以看到这些变量是在 process.env

    但是当我的项目构建时,我的所有env变量都是未定义的(在此期间它们不可用 RUN 命令)

    这个 eval env > ./.env && 行将我使用ENV命令设置的变量放入。env,但我不能在dockerfile中硬编码这些变量

    我希望我能做一些类似的事情:

    ENV MY_VAR $process.env.MY_VAR

    像这样的东西来获取我的环境变量?

    编辑:

    网页包。配置。js公司:

    require('dotenv').config()
    
    const webpack = require("webpack");
    const path = require("path");
    const HtmlWebpackPlugin = require("html-webpack-plugin");
    
    const BUILD_PATH = path.resolve(__dirname, "./client/build") + '/';
    const SOURCE_PATH = path.resolve(__dirname, "./client/src") + '/';
    const PUBLIC_PATH = path.resolve(__dirname, "./client/build") + '/';
    
    const env = require('./env')(PUBLIC_PATH)
    
    
    module.exports = () => {
      return {
        entry: ["idempotent-babel-polyfill", SOURCE_PATH + "/index.jsx"],
    
        context: SOURCE_PATH,
    
        output: {
          path: BUILD_PATH,
          filename: "bundle.js",
          publicPath: PUBLIC_PATH
        },
    
        module: {
          rules: [
            {
              test: /\.jsx?$/,
              exclude: /node_modules/,
              use: [
                { loader: "babel-loader" },
              ]
            },
            {
              test: /\.scss$/,
              exclude: /node_modules/,
              use: [
                { loader: "style-loader" },
                { loader: "css-loader" },
                { loader: "sass-loader" }
              ]
            },
            {
              test: /\.(png|jpg|gif)$/,
              exclude: /node_modules/,
              use: [
                { loader: "file-loader" }
              ]
            }
          ]
        },
    
        devServer: {
          compress: true,
          port: 3002,
          historyApiFallback: true,
          contentBase: BUILD_PATH,
          publicPath: PUBLIC_PATH
        },
    
        devtool: "eval-source-map",
    
        plugins: [
          new webpack.DefinePlugin(env),
          new HtmlWebpackPlugin({
            filename: "index.html",
            template: path.resolve(SOURCE_PATH + "/index.html"),
            inject: true
          }),
          new webpack.optimize.UglifyJsPlugin(),
        ],
    
        watch: false,
    
      }
    };
    

    环境。js公司:

    require('dotenv').config()
    
    // Grab NODE_ENV and REACT_APP_* environment variables and prepare them to be
    // injected into the application via DefinePlugin in Webpack configuration.
    var REACT_APP = /^REACT_APP_/i;
    
    function getClientEnvironment(publicUrl) {
      var processEnv = Object
        .keys(process.env)
        .filter(key => REACT_APP.test(key))
        .reduce((env, key) => {
          env[key] = process.env[key];
          return env;
        }, {
            'NODE_ENV': process.env.NODE_ENV || 'development',
            'MY_VAR': process.env.MY_VAR // for example
          });
    
      processEnv['process.env'] = Object
        .keys(processEnv)
        .reduce((env, key) => {
          env[key] = JSON.stringify(processEnv[key]);
          return env;
        }, {})
    
      return processEnv;
    }
    
    module.exports = getClientEnvironment;
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   jonnyg    7 年前

    在docker的CMD语句中执行build命令可以解决这个问题

    推荐文章