diff --git a/src/apptask.js b/src/apptask.js index 998445728..abc7709a0 100644 --- a/src/apptask.js +++ b/src/apptask.js @@ -657,7 +657,7 @@ function runApp(app, callback) { } function stopApp(app, callback) { - docker.stopContainer(app.containerId, function (error) { + docker.stopContainers(app.id, function (error) { if (error) return callback(error); updateApp(app, { runState: appdb.RSTATE_STOPPED }, callback); diff --git a/src/docker.js b/src/docker.js index 2143d659d..a06c8c5b8 100644 --- a/src/docker.js +++ b/src/docker.js @@ -16,6 +16,7 @@ exports = module.exports = { createContainer: createContainer, startContainer: startContainer, stopContainer: stopContainer, + stopContainers: stopContainers, deleteContainer: deleteContainer, deleteImage: deleteImage, deleteContainers: deleteContainers @@ -289,6 +290,23 @@ function deleteContainers(appId, callback) { }); } +function stopContainers(appId, callback) { + assert.strictEqual(typeof appId, 'string'); + assert.strictEqual(typeof callback, 'function'); + + var docker = exports.connection; + + debug('stopping containers of %s', appId); + + docker.listContainers({ all: 1, filters: JSON.stringify({ label: [ 'appId=' + appId ] }) }, function (error, containers) { + if (error) return callback(error); + + async.eachSeries(containers, function (container, iteratorDone) { + stopContainer(container.Id, iteratorDone); + }, callback); + }); +} + function deleteImage(manifest, callback) { assert(!manifest || typeof manifest === 'object'); assert.strictEqual(typeof callback, 'function');