2016-07-08 46 views
0

我需要从节点运行容器,因此我使用dockerode模块,该模块使用Docker API。为了运行一个容器,我首先需要拉取图像(如果它本地不存在)。我有promisified简单的要求,但我很难找出如何连接电话,特别是关于pull提供的回调。这里就是我:我该如何等待拉力?

init: function(opts) { 
    var self = this; 
    self.docker = new Docker(); 
    self.pull = Bluebird.promisify(
     self.docker.pull, { context: self.docker } 
    ); 
    self.createContainer = Bluebird.promisify(
     self.docker.createContainer, { context: self.docker } 
    ); 
}, 

run: function(opts) { 
    var self = this; 
    return self.createContainer(opts).catch(function(e) { 
     return self.pull(opts.Image).then(function(stream) { 
      return self.createContainer(opts); 
     }); 
    }).then(function(o) {; 
     var start = Bluebird.promisify(
      o.start, { context: o } 
     ); 
     return start({}); 
    }).then(function(o) {; 
     var inspect = Bluebird.promisify(
      o.inspect, {context: o} 
     ); 
     return inspect(); 
    }); 
}, 

所以会发生什么是第一createContainer失败(因为图像尚未加载)和pull通话发生。当成功时,调用createContainer

目前调用失败,因为图像还没有时间加载。我看到在docs:https://github.com/apocas/dockerode(见辅助函数),我可以这样做:

 return self.pull(opts.Image).then(function(stream) { 
      self.docker.modem.followProgress(stream, function(err, output) { 
       return self.createContainer(opts); 
      }); 
     }); 

...我想办法createContainer只会火的时候拉已经完成,但问题是我已经打破了承诺。处理这个问题的正确方法是什么?

TIA - 电子

*解决*

按以下约书亚的答案,这里的工作代码:

init: function(opts) { 
    var self = this; 
    self.docker = new Docker(); 
    self.pull = Bluebird.promisify(
     self.docker.pull, {context: self.docker} 
    ); 
    self.createContainer = Bluebird.promisify(
     self.docker.createContainer, {context: self.docker} 
    ); 
    self.followProgress = Bluebird.promisify(
     function(stream, done) { 
      return self.docker.modem.followProgress(stream, done); 
     }, 
     {context: self.docker.modem} 
    ); 
}, 
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) { 
     var start = Bluebird.promisify(
      o.start, {context: o} 
     ); 
     start(); 
     return o; 
    }).then(function(o) {; 
     var inspect = Bluebird.promisify(
      o.inspect, {context: o} 
     ); 
     return inspect(); 
    }); 
}, 

我只是不开心的start()结果得到失去了,但如果我想在运行后检查,我需要o,我不知道如何处理两者。但上述工作

回答

2

说到泛泛这里,假设你有:

return createsPromiseA().then((a) => { 
    takesNodebackB(a, (err, b) => { 
    let promiseC = createsPromiseC(); 
    // How do I return promiseC?? 
    }); 
}); 

有2个答案。一个使用什么自带的承诺ootb:

return createsPromiseA().then((a) => { 
    return new Promise((resolve, reject) => { 
    takesNodebackB(a, (err, b) => { 
     if (err) return reject(err); 
     resolve(b); 
    }); 
    }); 
}).then((b) => createsPromiseC()); 

这里的技巧是包装节点的功能在承诺。

第二个答案是,蓝鸟附带http://bluebirdjs.com/docs/api/promise.promisify.html它,虽然我没有用它,应该让你做同样的事情,是这样的:

return createsPromiseA() 
    .then((a) => bluebird.promisify(takesNodebackB)(a)) 
    .then((b) => createsPromiseC()); 
相关问题