2016-07-08 26 views
0

ノードからコンテナを実行する必要があるため、Docker APIを使用するdockerodeモジュールを使用しています。コンテナを実行するには、最初にイメージをプルする必要があります(ローカルに存在しない場合)。私はを約束しましたシンプルさが求められていますが、私は、特に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が呼び出されます。

現在、イメージがまだ読み込まれていないため、呼び出しに失敗しています。私は、ドキュメントで参照してください。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 - 電子

* *以下のジョシュアの答えは1として

を決意し、ここで働いているコード:

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つの答えがあります。

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()); 
関連する問題