diff --git a/index.d.ts b/index.d.ts index c0a81a6..9d3163c 100644 --- a/index.d.ts +++ b/index.d.ts @@ -18,11 +18,11 @@ export declare function restartOne(service: String, options: IDockerComposeOptio export declare function rm(options: IDockerComposeOptions): Promise; -export declare function exec(container: String, command: String, options: IDockerComposeOptions): Promise; +export declare function exec(container: String, command: String | String[], options: IDockerComposeOptions): Promise; export declare function logs(services: String[], options: IDockerComposeLogOptions): Promise; -export declare function run(service: String, command: String, options: IDockerComposeOptions): Promise; +export declare function run(service: String, command: String | String[], options: IDockerComposeOptions): Promise; export declare function buildAll(options: IDockerComposeBuildOptions): Promise; diff --git a/index.js b/index.js index 9ec8f22..596a13b 100644 --- a/index.js +++ b/index.js @@ -180,7 +180,7 @@ const rm = function (options) { /** * Execute command in a running container * @param {string} container container name - * @param {string} command command to execute + * @param {string|string[]} command command to execute * @param {object} options * @param {string} options.cwd * @param {boolean} [options.log] @@ -191,7 +191,7 @@ const rm = function (options) { * @return {object} std.out / std.err */ const exec = function (container, command, options) { - const args = command.split(/\s+/); + const args = Array.isArray(command) ? command : command.split(/\s+/); return execCompose('exec', [ '-T', container ].concat(args), options); }; @@ -199,7 +199,7 @@ const exec = function (container, command, options) { /** * Run command * @param {string} container container name - * @param {string} command command to execute + * @param {string|string[]} command command to execute * @param {object} options * @param {string} options.cwd * @param {boolean} [options.log] @@ -210,7 +210,7 @@ const exec = function (container, command, options) { * @return {object} std.out / std.err */ const run = function (container, command, options) { - const args = command.split(/\s+/); + const args = Array.isArray(command) ? command : command.split(/\s+/); return execCompose('run', [ '-T', container ].concat(args), options); }; diff --git a/readme.md b/readme.md index 9d085f0..15bffbe 100644 --- a/readme.md +++ b/readme.md @@ -1,4 +1,4 @@ - + # Manage Docker-Compose via Node.js diff --git a/test/index.js b/test/index.js index 346a24e..7f92518 100644 --- a/test/index.js +++ b/test/index.js @@ -191,6 +191,38 @@ test('ensure run and exec are working', async assert => { assert.end(); }); +test('ensure run and exec with command defined as array are working', async assert => { + const checkOSID = (out, id) => { + // parse /etc/os-release contents + const re = /([\w,_]+)=(.*)/g; + let match = null; + const os = {}; + + while ((match = re.exec(out)) !== null) { // eslint-disable-line no-cond-assign + os[match[1]] = match[2]; + } + + assert.equals(os.ID, id); + }; + + const opts = { cwd: path.join(__dirname), log: false }; + + await compose.upAll(opts); + + assert.true(await isContainerRunning('/compose_test_nginx')); + + let std = await compose.exec('db', [ '/bin/sh', '-c', 'cat /etc/os-release' ], opts); + + assert.false(std.err); + checkOSID(std.out, 'debian'); + + std = await compose.run('alpine', [ '/bin/sh', '-c', 'cat /etc/os-release' ], opts); + assert.false(std.err); + checkOSID(std.out, 'alpine'); + + assert.end(); +}); + test('build single service', async assert => { const opts = { cwd: path.join(__dirname),