From 83388ec31ae0e81fec0c6904f74e04345f1fb069 Mon Sep 17 00:00:00 2001 From: Piotr Szymanski Date: Tue, 18 Oct 2016 19:05:32 +0200 Subject: [PATCH] enable -v flag for docker-compose run command Give user ability to attach volumes while running containers with docker-compose run command. Example is given in the test implementation, command is compatible with the one provided by docker engine. Signed-off-by: Piotr Szymanski --- compose/cli/main.py | 8 ++++- tests/acceptance/cli_test.py | 34 +++++++++++++++++++ .../docker-compose.yml | 2 ++ .../files/example.txt | 1 + tests/unit/cli_test.py | 3 ++ 5 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 tests/fixtures/simple-composefile-volume-ready/docker-compose.yml create mode 100644 tests/fixtures/simple-composefile-volume-ready/files/example.txt diff --git a/compose/cli/main.py b/compose/cli/main.py index a7aec945e..a16448293 100644 --- a/compose/cli/main.py +++ b/compose/cli/main.py @@ -24,6 +24,7 @@ from ..config import ConfigurationError from ..config import parse_environment from ..config.environment import Environment from ..config.serialize import serialize_config +from ..config.types import VolumeSpec from ..const import IS_WINDOWS_PLATFORM from ..errors import StreamParseError from ..progress_stream import StreamOutputError @@ -678,7 +679,7 @@ class TopLevelCommand(object): running. If you do not want to start linked services, use `docker-compose run --no-deps SERVICE COMMAND [ARGS...]`. - Usage: run [options] [-p PORT...] [-e KEY=VAL...] SERVICE [COMMAND] [ARGS...] + Usage: run [options] [-v VOLUME...] [-p PORT...] [-e KEY=VAL...] SERVICE [COMMAND] [ARGS...] Options: -d Detached mode: Run container in the background, print @@ -692,6 +693,7 @@ class TopLevelCommand(object): -p, --publish=[] Publish a container's port(s) to the host --service-ports Run command with the service's ports enabled and mapped to the host. + -v, --volume=[] Bind mount a volume (default []) -T Disable pseudo-tty allocation. By default `docker-compose run` allocates a TTY. -w, --workdir="" Working directory inside the container @@ -1035,6 +1037,10 @@ def build_container_options(options, detach, command): if options['--workdir']: container_options['working_dir'] = options['--workdir'] + if options['--volume']: + volumes = [VolumeSpec.parse(i) for i in options['--volume']] + container_options['volumes'] = volumes + return container_options diff --git a/tests/acceptance/cli_test.py b/tests/acceptance/cli_test.py index cc7bc5dfe..0ddada5a0 100644 --- a/tests/acceptance/cli_test.py +++ b/tests/acceptance/cli_test.py @@ -5,6 +5,7 @@ from __future__ import unicode_literals import datetime import json import os +import os.path import signal import subprocess import time @@ -557,6 +558,39 @@ class CLITestCase(DockerClientTestCase): self.assertEqual(old_ids, new_ids) + def test_run_one_off_with_volume(self): + self.base_dir = 'tests/fixtures/simple-composefile-volume-ready' + volume_path = os.path.abspath(os.path.join(os.getcwd(), self.base_dir, 'files')) + cmd_result = self.dispatch([ + 'run', + '-v', '{}:/data'.format(volume_path), + 'simple', + 'cat', '/data/example.txt' + ]) + assert cmd_result.stdout.strip() == 'FILE_CONTENT' + + def test_run_one_off_with_multiple_volumes(self): + self.base_dir = 'tests/fixtures/simple-composefile-volume-ready' + volume_path = os.path.abspath(os.path.join(os.getcwd(), self.base_dir, 'files')) + + cmd_result = self.dispatch([ + 'run', + '-v', '{}:/data'.format(volume_path), + '-v', '{}:/data1'.format(volume_path), + 'simple', + 'cat', '/data/example.txt' + ]) + assert cmd_result.stdout.strip() == 'FILE_CONTENT' + + cmd_result = self.dispatch([ + 'run', + '-v', '{}:/data'.format(volume_path), + '-v', '{}:/data1'.format(volume_path), + 'simple', + 'cat', '/data1/example.txt' + ]) + assert cmd_result.stdout.strip() == 'FILE_CONTENT' + def test_create_with_force_recreate_and_no_recreate(self): self.dispatch( ['create', '--force-recreate', '--no-recreate'], diff --git a/tests/fixtures/simple-composefile-volume-ready/docker-compose.yml b/tests/fixtures/simple-composefile-volume-ready/docker-compose.yml new file mode 100644 index 000000000..98a7d23b7 --- /dev/null +++ b/tests/fixtures/simple-composefile-volume-ready/docker-compose.yml @@ -0,0 +1,2 @@ +simple: + image: busybox:latest diff --git a/tests/fixtures/simple-composefile-volume-ready/files/example.txt b/tests/fixtures/simple-composefile-volume-ready/files/example.txt new file mode 100644 index 000000000..edb4d3390 --- /dev/null +++ b/tests/fixtures/simple-composefile-volume-ready/files/example.txt @@ -0,0 +1 @@ +FILE_CONTENT diff --git a/tests/unit/cli_test.py b/tests/unit/cli_test.py index fb0511f0a..f9ce240a3 100644 --- a/tests/unit/cli_test.py +++ b/tests/unit/cli_test.py @@ -119,6 +119,7 @@ class CLITestCase(unittest.TestCase): '--entrypoint': None, '--service-ports': None, '--publish': [], + '--volume': [], '--rm': None, '--name': None, '--workdir': None, @@ -153,6 +154,7 @@ class CLITestCase(unittest.TestCase): '--entrypoint': None, '--service-ports': None, '--publish': [], + '--volume': [], '--rm': None, '--name': None, '--workdir': None, @@ -175,6 +177,7 @@ class CLITestCase(unittest.TestCase): '--entrypoint': None, '--service-ports': None, '--publish': [], + '--volume': [], '--rm': True, '--name': None, '--workdir': None,