diff --git a/src/docker.js b/src/docker.js index 2f159a2c3..665f8fbf1 100644 --- a/src/docker.js +++ b/src/docker.js @@ -23,10 +23,6 @@ exports = module.exports = { getEvents, memoryUsage, - createVolume, - removeVolume, - clearVolume, - update, createExec, @@ -42,7 +38,6 @@ const apps = require('./apps.js'), debug = require('debug')('box:docker'), delay = require('./delay.js'), Docker = require('dockerode'), - path = require('path'), reverseProxy = require('./reverseproxy.js'), services = require('./services.js'), settings = require('./settings.js'), @@ -52,9 +47,6 @@ const apps = require('./apps.js'), volumes = require('./volumes.js'), _ = require('underscore'); -const CLEARVOLUME_CMD = path.join(__dirname, 'scripts/clearvolume.sh'), - MKDIRVOLUME_CMD = path.join(__dirname, 'scripts/mkdirvolume.sh'); - const DOCKER_SOCKET_PATH = '/var/run/docker.sock'; const gConnection = new Docker({ socketPath: DOCKER_SOCKET_PATH }); @@ -630,53 +622,6 @@ async function memoryUsage(containerId) { return result; } -async function createVolume(name, volumeDataDir, labels) { - assert.strictEqual(typeof name, 'string'); - assert.strictEqual(typeof volumeDataDir, 'string'); - assert.strictEqual(typeof labels, 'object'); - - const volumeOptions = { - Name: name, - Driver: 'local', - DriverOpts: { // https://github.com/moby/moby/issues/19990#issuecomment-248955005 - type: 'none', - device: volumeDataDir, - o: 'bind' - }, - Labels: labels - }; - - // requires sudo because the path can be outside appsdata - let [error] = await safe(shell.promises.sudo('createVolume', [ MKDIRVOLUME_CMD, volumeDataDir ], {})); - if (error) throw new BoxError(BoxError.FS_ERROR, `Error creating app data dir: ${error.message}`); - - [error] = await safe(gConnection.createVolume(volumeOptions)); - if (error) throw new BoxError(BoxError.DOCKER_ERROR, error); -} - -async function clearVolume(name, options) { - assert.strictEqual(typeof name, 'string'); - assert.strictEqual(typeof options, 'object'); - - let volume = gConnection.getVolume(name); - let [error, v] = await safe(volume.inspect()); - if (error && error.statusCode === 404) return; - if (error) throw new BoxError(BoxError.DOCKER_ERROR, error); - - const volumeDataDir = v.Options.device; - [error] = await shell.promises.sudo('clearVolume', [ CLEARVOLUME_CMD, options.removeDirectory ? 'rmdir' : 'clear', volumeDataDir ], {}); - if (error) throw new BoxError(BoxError.FS_ERROR, error); -} - -// this only removes the volume and not the data -async function removeVolume(name) { - assert.strictEqual(typeof name, 'string'); - - let volume = gConnection.getVolume(name); - const [error] = await safe(volume.remove()); - if (error && error.statusCode !== 404) throw new BoxError(BoxError.DOCKER_ERROR, `removeVolume: Error removing volume: ${error.message}`); -} - async function info() { const [error, result] = await safe(gConnection.info()); if (error) throw new BoxError(BoxError.DOCKER_ERROR, 'Error connecting to docker'); diff --git a/src/services.js b/src/services.js index d831bde3a..673f95fe0 100644 --- a/src/services.js +++ b/src/services.js @@ -63,6 +63,8 @@ const addonConfigs = require('./addonconfigs.js'), const NOOP = async function (/*app, options*/) {}; const RMADDONDIR_CMD = path.join(__dirname, 'scripts/rmaddondir.sh'); const RESTART_SERVICE_CMD = path.join(__dirname, 'scripts/restartservice.sh'); +const CLEARVOLUME_CMD = path.join(__dirname, 'scripts/clearvolume.sh'); +const MKDIRVOLUME_CMD = path.join(__dirname, 'scripts/mkdirvolume.sh'); // setup can be called multiple times for the same app (configure crash restart) and existing data must not be lost // teardown is destructive. app data stored with the addon is lost @@ -858,9 +860,8 @@ async function setupLocalStorage(app, options) { const volumeDataDir = apps.getDataDir(app, app.dataDir); - // reomve any existing volume in case it's bound with an old dataDir - await docker.removeVolume(`${app.id}-localstorage`); - await docker.createVolume(`${app.id}-localstorage`, volumeDataDir, { fqdn: app.fqdn, appId: app.id }); + const [error] = await safe(shell.promises.sudo('createVolume', [ MKDIRVOLUME_CMD, volumeDataDir ], {})); + if (error) throw new BoxError(BoxError.FS_ERROR, `Error creating app storage data dir: ${error.message}`); } async function clearLocalStorage(app, options) { @@ -869,7 +870,9 @@ async function clearLocalStorage(app, options) { debug('clearLocalStorage'); - await docker.clearVolume(`${app.id}-localstorage`, { removeDirectory: false }); + const volumeDataDir = apps.getDataDir(app, app.dataDir); + const [error] = await shell.promises.sudo('clearVolume', [ CLEARVOLUME_CMD, 'clear', volumeDataDir ], {}); + if (error) throw new BoxError(BoxError.FS_ERROR, error); } async function teardownLocalStorage(app, options) { @@ -878,8 +881,9 @@ async function teardownLocalStorage(app, options) { debug('teardownLocalStorage'); - await docker.clearVolume(`${app.id}-localstorage`, { removeDirectory: true }); - await docker.removeVolume(`${app.id}-localstorage`); + const volumeDataDir = apps.getDataDir(app, app.dataDir); + const [error] = await shell.promises.sudo('clearVolume', [ CLEARVOLUME_CMD, 'rmdir', volumeDataDir ], {}); + if (error) throw new BoxError(BoxError.FS_ERROR, error); } async function setupTurn(app, options) {