Docker Node.js环境变量

Docker Node.js environment variables

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


编辑我的愚蠢造成的!

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


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

创建配置文件夹

把它放在config / index.js

1
2
3
4
5
6
7
8
9
10
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(具有实际配置的模板副本)

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
{
 "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对象:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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中,依此类推...


即使您只需要从命令(在docker run时)检索某些配置,也可以简单地通过从节点env(process.env)切换为argv使用来实现。
这样的caser并不罕见(docker-compose),可以很容易地完成。

npm install yargs --save

使用docker rundocker exec运行代码:

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

然后在代码中:

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