Как мне получить переменные среды докера, доступные мне в файле докера? (с использованием React / JS / webpack)

файл докеров:

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, но я не могу жестко запрограммировать эти переменные в файле докеров.

Хотел бы я сделать что-нибудь вроде:

ENV MY_VAR $process.env.MY_VAR

Что-нибудь подобное, чтобы получить переменные среды?

изменить:

webpack.config.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,

  }
};

env.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;

person jonnyg    schedule 09.05.2018    source источник
comment
Покажите, пожалуйста, конфигурацию вашего веб-пакета   -  person mpontus    schedule 09.05.2018
comment
@mpontus afk прямо сейчас, но мой веб-пакет получает переменные .env из process.env, и он работает, когда создается и обслуживается локально   -  person jonnyg    schedule 09.05.2018
comment
Я просто попробовал ваш подход с помощью приложения create-react-app, и он сработал. Можете ли вы поделиться минимальным примером вашей точной настройки на github?   -  person mpontus    schedule 09.05.2018


Ответы (1)


Выполнение команды сборки внутри оператора CMD докера решает эту проблему.

person jonnyg    schedule 21.05.2018