【问题标题】:Docker Node.js environment variablesDocker Node.js 环境变量
【发布时间】:2016-04-05 13:05:35
【问题描述】:

我正在尝试在 docker 上使用环境变量,仅用于 on 命令。在 Mac/Linux 上,我可以简单地运行 token=1234 node command.js 并且令牌可作为环境变量使用。但是当我使用 docker docker exec $CONTAINER nenv token=123 node command.js 执行此操作时,我得到 unknown command token=123

【问题讨论】:

标签: node.js docker


【解决方案1】:

我不使用节点环境, 我建议执行以下操作:

创建 config 文件夹

把它放在 config/index.js

var
    nconf = require('nconf'),
    path = require('path');

nconf.env().argv();

nconf.file('local', path.join(__dirname, 'config.local.json'));
nconf.file(path.join(__dirname, 'config.json'));

module.exports = nconf;

创建文件:config/config.json(配置模板)和config/config.local.json(带有真实配置的模板副本)

例如:

{
  "app": {
    "useCluster": false,
    "http": {
      "enabled": true,
      "port": 8000,
      "host": "0.0.0.0"
    },
    "https": {
      "enabled": false,
      "port": 443,
      "host": "0.0.0.0",
      "certificate": {
        "key": "server.key",
        "cert": "server.crt"
      }
    },
    "env": "production",
    "profiler": false
  },
  "db": {
    "driver": "mysql",
    "host": "address here",
    "port": 3306,
    "user": "username here",
    "pass": "password here",
    "name": "database name here"
  },
}

在您的应用开头使用:var config = require('./config');

并在需要时使用 config 对象:

var config = require('./config'),
    cluster = require('./components/cluster'),
    http = require('http'),
    ...
    ...
    https = require('https');

cluster.start(function() {
    if (config.get('app:http:enabled')) {
        var httpServer = http.createServer(app);
        httpServer.listen(config.get('app:http:port'), config.get('app:http:host'),
            function () {
                winston.info('App listening at http://%s:%s', config.get('app:http:host'), config.get('app:http:port'));
            });
    }

    if (config.get('app:https:enabled')) {
        var httpsServer = https.createServer({
            key: fs.readFileSync(path.join(__dirname, 'certificates', config.get('app:https:certificate:key'))),
            cert: fs.readFileSync(path.join(__dirname, 'certificates', config.get('app:https:certificate:cert')))
        }, app);
        httpsServer.listen(config.get('app:https:port'), config.get('app:https:host'),
            function () {
                winston.info('App listening at https://%s:%s', config.get('app:https:host'), config.get('app:https:port'));
            });
    }
});

这个例子是基于环境的配置更准确的方法。例如:config.local.json 配置将被添加到 .gitignore 等等...

【讨论】:

  • 这种方法在我们的用例中似乎是不必要的工作。我们将我们的 repo 克隆到我们新的 docker 镜像中。因此,使用您的方法,我们必须从 docker cmd 行创建一个配置文件,然后运行脚本
  • 不,只需在 docker app 中创建文件 config.local.json,它会保留配置,您也可以尝试修改 config/index.js 以从参数中读取配置,使用 node-argument-解析器是很好的包。
【解决方案2】:

由于我的愚蠢造成的编辑!

您不能在现有 docker 上使用 docker 设置新的 env var。 您必须在构建它(使用 Dockerfile 或 docker-compose)或运行它(使用 docker run $CONTAINER -e "name=value" command)时执行此操作。

【讨论】:

    【解决方案3】:

    即使您需要简单地从命令中检索某些配置(在docker run 时间),您也可以通过从 node env (process.env) 切换到 argv 使用来完成。
    这种情况并不少见 (docker-compose),并且可以通过非常简单的方式完成。

    npm install yargs --save

    使用docker rundocker exec 运行代码:

    docker exec $CONTAINER node command.j --token 123

    然后在代码中:

    const argv = require('yargs').argv;
    ...
    let boo = do.something(argv.token);
    

    【讨论】:

      猜你喜欢
      • 2016-02-06
      • 2020-12-07
      • 2015-06-17
      • 2021-06-24
      • 1970-01-01
      • 2016-02-08
      • 2018-09-18
      • 2021-01-23
      • 2021-02-15
      相关资源
      最近更新 更多