ノードからコンテナを実行する必要があるため、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
が必要で、私は両方をどう扱うべきか分からない。しかし、上記のは、あなたが持っていると仮定し、ここでは一般論で言えば