diff --git a/index.d.ts b/index.d.ts index 9cea591..86c792b 100644 --- a/index.d.ts +++ b/index.d.ts @@ -25,6 +25,7 @@ declare module "docker-compose" { config?: string | string[]; log?: boolean; composeOptions?: string[] | Array; + commandOptions?: string[] | Array; } interface IDockerComposeLogOptions extends IDockerComposeOptions { diff --git a/index.js b/index.js index 6856b2b..2cc4122 100644 --- a/index.js +++ b/index.js @@ -47,13 +47,16 @@ const composeOptionsToArgs = function (composeOptions) { * @param {boolean} [options.log] * @param {?(string|string[])} [options.config] * @param {?object} [options.env] + * @param {?(string[]|Array)} [options.commandOptions] * @param {?(string[]|Array)} [options.composeOptions] */ const execCompose = (command, args, options) => new Promise((resolve, reject) => { const composeOptions = options.composeOptions || []; - let composeArgs = configToArgs(options.config).concat([ command ], args); + const commandOptions = options.commandOptions || []; + let composeArgs = composeOptionsToArgs(composeOptions); + + composeArgs = composeArgs.concat(configToArgs(options.config).concat([ command ].concat(composeOptionsToArgs(commandOptions), args))); - composeArgs = composeArgs.concat(composeOptionsToArgs(composeOptions)); const cwd = options.cwd; const env = options.env || null; @@ -186,6 +189,7 @@ const rm = function (options) { * @return {object} std.out / std.err */ const exec = function (container, command, options) { + const args = command.split(/\s+/); return execCompose('exec', [ '-T', container ].concat(args), options); diff --git a/readme.md b/readme.md index 2b13e3e..71297a8 100644 --- a/readme.md +++ b/readme.md @@ -62,7 +62,8 @@ compose.exec('node', 'npm install', { cwd: path.join(__dirname) }) * `cwd {string}`: mandatory folder path to the `docker-compose.yml` * `config {(string|string[])}`: custom and/or multiple yml files can be specified (relative to `cwd`) * `[log] {boolean}`: optional setting to enable console logging (output of `docker-compose` `stdout`/`stderr` output) -* `[commandOptions] string[]|Array { test('ensure container gets started with --build option', async assert => { await compose.down({ cwd: path.join(__dirname), log: true, config: 'docker-compose-build.yml' }); - await compose.upAll({ cwd: path.join(__dirname), log: true, config: 'docker-compose-build.yml', composeOptions: [ '--build' ]}); + await compose.upAll({ cwd: path.join(__dirname), log: true, config: 'docker-compose-build.yml', commandOptions: [ '--build' ]}); assert.true(await isContainerRunning('/compose_test_mongodb')); await compose.down({ cwd: path.join(__dirname), log: true, config: 'docker-compose-build.yml' }); @@ -64,7 +64,7 @@ test('ensure container gets started with --build option', async assert => { test('ensure container gets started with --build and --timeout option', async assert => { await compose.down({ cwd: path.join(__dirname), log: true, config: 'docker-compose-build.yml' }); - await compose.upAll({ cwd: path.join(__dirname), log: true, config: 'docker-compose-build.yml', composeOptions: [[ '--build' ], [ '--timeout', '5' ]]}); + await compose.upAll({ cwd: path.join(__dirname), log: true, config: 'docker-compose-build.yml', commandOptions: [[ '--build' ], [ '--timeout', '5' ]]}); assert.true(await isContainerRunning('/compose_test_mongodb')); await compose.down({ cwd: path.join(__dirname), log: true, config: 'docker-compose-build.yml' }); @@ -73,13 +73,30 @@ test('ensure container gets started with --build and --timeout option', async as test('ensure container gets started with --build and --timeout option', async assert => { await compose.down({ cwd: path.join(__dirname), log: true, config: 'docker-compose-build.yml' }); - await compose.upAll({ cwd: path.join(__dirname), log: true, config: 'docker-compose-build.yml', composeOptions: [ '--build', [ '--timeout', '5' ]]}); + await compose.upAll({ cwd: path.join(__dirname), log: true, config: 'docker-compose-build.yml', commandOptions: [ '--build', [ '--timeout', '5' ]]}); assert.true(await isContainerRunning('/compose_test_mongodb')); await compose.down({ cwd: path.join(__dirname), log: true, config: 'docker-compose-build.yml' }); assert.end(); }); +test('ensure container command executed with --workdir command option', async assert => { + await compose.down({ cwd: path.join(__dirname), log: true, config: 'docker-compose-42.yml' }); + + assert.doesNotThrow(async () => { + await compose.run('some-service', 'cat hello.txt', { + cwd: path.join(__dirname), + log: true, + config: 'docker-compose-42.yml', + composeOptions: [ '--verbose' ], + commandOptions: [ '--workdir', '/mountedvolume/nested/dir' ] + }); + }); + + await compose.down({ cwd: path.join(__dirname), log: true, config: 'docker-compose-42.yml' }); + assert.end(); +}); + test('ensure only single container gets started', async assert => { await compose.down({ cwd: path.join(__dirname), log: true }); await compose.upOne('alpine', { cwd: path.join(__dirname), log: true }); diff --git a/test/volume/nested/dir/hello.txt b/test/volume/nested/dir/hello.txt new file mode 100644 index 0000000..d5490b7 --- /dev/null +++ b/test/volume/nested/dir/hello.txt @@ -0,0 +1 @@ +HI!