Allow passing an array as command to run and exec

This commit is contained in:
Eduardo Weiland 2019-07-09 15:41:13 -03:00
parent f77821303d
commit 5bd54c3049
No known key found for this signature in database
GPG key ID: 52F01882A0EAA2E5
3 changed files with 38 additions and 6 deletions

4
index.d.ts vendored
View file

@ -18,11 +18,11 @@ export declare function restartOne(service: String, options: IDockerComposeOptio
export declare function rm(options: IDockerComposeOptions): Promise<IDockerComposeResult>;
export declare function exec(container: String, command: String, options: IDockerComposeOptions): Promise<IDockerComposeResult>;
export declare function exec(container: String, command: String | String[], options: IDockerComposeOptions): Promise<IDockerComposeResult>;
export declare function logs(services: String[], options: IDockerComposeLogOptions): Promise<IDockerComposeResult>;
export declare function run(service: String, command: String, options: IDockerComposeOptions): Promise<IDockerComposeResult>;
export declare function run(service: String, command: String | String[], options: IDockerComposeOptions): Promise<IDockerComposeResult>;
export declare function buildAll(options: IDockerComposeBuildOptions): Promise<IDockerComposeResult>;

View file

@ -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);
};

View file

@ -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),