diff --git a/src/docker.js b/src/docker.js index a072f45e0..d8731cc06 100644 --- a/src/docker.js +++ b/src/docker.js @@ -23,7 +23,6 @@ exports = module.exports = { inspectByName: inspect, getEvents: getEvents, memoryUsage: memoryUsage, - execContainer: execContainer, createVolume: createVolume, removeVolume: removeVolume, clearVolume: clearVolume @@ -43,12 +42,10 @@ var addons = require('./addons.js'), child_process = require('child_process'), constants = require('./constants.js'), debug = require('debug')('box:docker.js'), - once = require('once'), path = require('path'), settings = require('./settings.js'), shell = require('./shell.js'), safe = require('safetydance'), - spawn = child_process.spawn, util = require('util'), _ = require('underscore'); @@ -208,7 +205,7 @@ function createSubcontainer(app, name, cmd, options, callback) { if (!isAppContainer) memoryLimit *= 2; addons.getEnvironment(app, function (error, addonEnv) { - if (error) return callback(new Error('Error getting addon environment : ' + error)); + if (error) return callback(new BoxError(BoxError.DATABASE_ERROR, 'Error getting addon environment : ' + error.message)); // do no set hostname of containers to location as it might conflict with addons names. for example, an app installed in mail // location may not reach mail container anymore by DNS. We cannot set hostname to fqdn either as that sets up the dns @@ -279,7 +276,11 @@ function createSubcontainer(app, name, cmd, options, callback) { debugApp(app, 'Creating container for %s', app.manifest.dockerImage); - docker.createContainer(containerOptions, callback); + docker.createContainer(containerOptions, function (error) { + if (error) return callback(new BoxError(BoxError.DOCKER_ERROR, error)); + + callback(); + }); }); } @@ -323,12 +324,12 @@ function stopContainer(containerId, callback) { }; container.stop(options, function (error) { - if (error && (error.statusCode !== 304 && error.statusCode !== 404)) return callback(new Error('Error stopping container:' + error)); + if (error && (error.statusCode !== 304 && error.statusCode !== 404)) return callback(new BoxError(BoxError.DOCKER_ERROR, 'Error stopping container:' + error.message)); debug('Waiting for container ' + containerId); container.wait(function (error, data) { - if (error && (error.statusCode !== 304 && error.statusCode !== 404)) return callback(new Error('Error waiting on container:' + error)); + if (error && (error.statusCode !== 304 && error.statusCode !== 404)) return callback(new BoxError(BoxError.DOCKER_ERROR, 'Error waiting on container:' + error.message)); debug('Container %s stopped with status code [%s]', containerId, data ? String(data.StatusCode) : ''); @@ -358,7 +359,7 @@ function deleteContainer(containerId, callback) { if (error) debug('Error removing container %s : %j', containerId, error); - callback(error); + callback(new BoxError(BoxError.DOCKER_ERROR, error)); }); } @@ -424,7 +425,7 @@ function deleteImage(manifest, callback) { if (error) debug('Error removing image %s : %j', dockerImage, error); - callback(error); + callback(new BoxError(BoxError.DOCKER_ERROR, error)); }); } @@ -492,37 +493,6 @@ function memoryUsage(containerId, callback) { }); } -function execContainer(containerId, cmd, options, callback) { - assert.strictEqual(typeof containerId, 'string'); - assert(util.isArray(cmd)); - assert.strictEqual(typeof options, 'object'); - assert.strictEqual(typeof callback, 'function'); - - callback = once(callback); // ChildProcess exit may or may not be called after error - - var cp = spawn('/usr/bin/docker', [ 'exec', '-i', containerId ].concat(cmd)); - - var chunks = [ ]; - - if (options.stdout) { - cp.stdout.pipe(options.stdout); - } else if (options.bufferStdout) { - cp.stdout.on('data', function (chunk) { chunks.push(chunk); }); - } else { - cp.stdout.pipe(process.stdout); - } - - cp.on('error', callback); - cp.on('exit', function (code, signal) { - debug('execContainer code: %s signal: %s', code, signal); - if (!callback.called) callback(code ? 'Failed with status ' + code : null, Buffer.concat(chunks)); - }); - - cp.stderr.pipe(options.stderr || process.stderr); - - if (options.stdin) options.stdin.pipe(cp.stdin).on('error', callback); -} - function createVolume(app, name, volumeDataDir, callback) { assert.strictEqual(typeof app, 'object'); assert.strictEqual(typeof name, 'string'); @@ -570,7 +540,11 @@ function clearVolume(app, name, options, callback) { if (error) return callback(new BoxError(BoxError.DOCKER_ERROR, error)); const volumeDataDir = v.Options.device; - shell.sudo('clearVolume', [ CLEARVOLUME_CMD, options.removeDirectory ? 'rmdir' : 'clear', volumeDataDir ], {}, callback); + shell.sudo('clearVolume', [ CLEARVOLUME_CMD, options.removeDirectory ? 'rmdir' : 'clear', volumeDataDir ], {}, function (error) { + if (error) return callback(new BoxError(BoxError.FS_ERROR, error)); + + callback(); + }); }); } @@ -584,7 +558,7 @@ function removeVolume(app, name, callback) { let volume = docker.getVolume(name); volume.remove(function (error) { - if (error && error.statusCode !== 404) return callback(new Error(`removeVolume: Error removing volume of ${app.id} ${error.message}`)); + if (error && error.statusCode !== 404) return callback(new BoxError(BoxError.DOCKER_ERROR, `removeVolume: Error removing volume of ${app.id} ${error.message}`)); callback(); });