第一次来自inspect的Null端口绑定。第二次好。为什么?

时间:2016-07-08 23:08:31

标签: node.js docker

我使用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()结束时运行的检查会返回除端口映射之外的所有内容。如果我没有正确等待启动过程,检查会返回一个空值。

关于这里可能会发生什么或者我应该做些什么的想法?

1 个答案:

答案 0 :(得分:0)

好的,答案是我必须等待start方法完成