我需要从节点运行容器,因此我使用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
,我不知道如何处理两者。但上述工作