【发布时间】: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
【问题讨论】:
我正在尝试在 docker 上使用环境变量,仅用于 on 命令。在 Mac/Linux 上,我可以简单地运行 token=1234 node command.js 并且令牌可作为环境变量使用。但是当我使用 docker docker exec $CONTAINER nenv token=123 node command.js 执行此操作时,我得到 unknown command token=123
【问题讨论】:
我不使用节点环境, 我建议执行以下操作:
创建 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 等等...
【讨论】:
由于我的愚蠢造成的编辑!
您不能在现有 docker 上使用 docker 设置新的 env var。
您必须在构建它(使用 Dockerfile 或 docker-compose)或运行它(使用 docker run $CONTAINER -e "name=value" command)时执行此操作。
【讨论】:
即使您需要简单地从命令中检索某些配置(在docker run 时间),您也可以通过从 node env (process.env) 切换到 argv 使用来完成。
这种情况并不少见 (docker-compose),并且可以通过非常简单的方式完成。
npm install yargs --save
使用docker run 或docker exec 运行代码:
docker exec $CONTAINER node command.j --token 123
然后在代码中:
const argv = require('yargs').argv;
...
let boo = do.something(argv.token);
【讨论】: