我使用https://github.com/apocas/dockerode从node.js app管理docker容器并编写了以下函数:
run: function(opts) {
var self = this;
return self.createContainer(opts).catch(function(e) {
return self.pull(opts.Image).then(function(stream) {
return self.followProgress(stream);
}).then(function() {
return self.createContainer(opts);
});
}).then(function(o) {
Bluebird.promisify(o.start, {context: o})();
return o;
}).then(function(o) {;
var inspect = Bluebird.promisify(
o.inspect, {context: o}
);
return inspect();
});
},
我称之为:
bitcoind: function(opts) {
return this.run({
name: 'bitcoind',
Image: 'seegno/bitcoind:latest',
Env: ['BITCOIN_DATA=/data'],
Binds: [process.cwd() + '/bitcoind:/data'],
HostConfig: {
PortBindings: {
'8332/tcp': [{ HostPort: '8332' }]
}
},
Cmd: [
'-server',
'-rpcuser=' + opts.user,
'-rpcpassword=' + opts.pass,
'-printtoconsole'
]
});
},
一切都很完美,差不多。如果我像这样启动我的bitcoind服务器:
docker.bitcoind(config.bitcoind).then(function(info) {
var p = info.NetworkSettings.Ports;
console.log(p);
});
控制台显示" null"。港口没有设定。命令行显示正确的值。运行
$ docker inspect bitcoind
我明白了:
"Ports": {
"18332/tcp": null,
"18333/tcp": null,
"18444/tcp": null,
"8332/tcp": [
{
"HostIp": "0.0.0.0",
"HostPort": "8332"
}
],
"8333/tcp": null
},
这是我的预期。因此,出于好奇,我跑了:
docker.inspect('693f32482b46').then(function(info) {
console.log(info);
});
并包含端口信息!所以我很困惑为什么我在run()
结束时运行的检查会返回除端口映射之外的所有内容。如果我没有正确等待启动过程,检查会返回一个空值。
关于这里可能会发生什么或者我应该做些什么的想法?
答案 0 :(得分:0)
好的,答案是我必须等待start
方法完成