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 <skyleton@gmail.com>
This commit is contained in:
Piotr Szymanski 2016-10-18 19:05:32 +02:00 committed by Joffrey F
parent 31b2d9176b
commit 83388ec31a
5 changed files with 47 additions and 1 deletions

View File

@ -24,6 +24,7 @@ from ..config import ConfigurationError
from ..config import parse_environment from ..config import parse_environment
from ..config.environment import Environment from ..config.environment import Environment
from ..config.serialize import serialize_config from ..config.serialize import serialize_config
from ..config.types import VolumeSpec
from ..const import IS_WINDOWS_PLATFORM from ..const import IS_WINDOWS_PLATFORM
from ..errors import StreamParseError from ..errors import StreamParseError
from ..progress_stream import StreamOutputError from ..progress_stream import StreamOutputError
@ -678,7 +679,7 @@ class TopLevelCommand(object):
running. If you do not want to start linked services, use running. If you do not want to start linked services, use
`docker-compose run --no-deps SERVICE COMMAND [ARGS...]`. `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: Options:
-d Detached mode: Run container in the background, print -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 -p, --publish=[] Publish a container's port(s) to the host
--service-ports Run command with the service's ports enabled and mapped --service-ports Run command with the service's ports enabled and mapped
to the host. to the host.
-v, --volume=[] Bind mount a volume (default [])
-T Disable pseudo-tty allocation. By default `docker-compose run` -T Disable pseudo-tty allocation. By default `docker-compose run`
allocates a TTY. allocates a TTY.
-w, --workdir="" Working directory inside the container -w, --workdir="" Working directory inside the container
@ -1035,6 +1037,10 @@ def build_container_options(options, detach, command):
if options['--workdir']: if options['--workdir']:
container_options['working_dir'] = 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 return container_options

View File

@ -5,6 +5,7 @@ from __future__ import unicode_literals
import datetime import datetime
import json import json
import os import os
import os.path
import signal import signal
import subprocess import subprocess
import time import time
@ -557,6 +558,39 @@ class CLITestCase(DockerClientTestCase):
self.assertEqual(old_ids, new_ids) 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): def test_create_with_force_recreate_and_no_recreate(self):
self.dispatch( self.dispatch(
['create', '--force-recreate', '--no-recreate'], ['create', '--force-recreate', '--no-recreate'],

View File

@ -0,0 +1,2 @@
simple:
image: busybox:latest

View File

@ -0,0 +1 @@
FILE_CONTENT

View File

@ -119,6 +119,7 @@ class CLITestCase(unittest.TestCase):
'--entrypoint': None, '--entrypoint': None,
'--service-ports': None, '--service-ports': None,
'--publish': [], '--publish': [],
'--volume': [],
'--rm': None, '--rm': None,
'--name': None, '--name': None,
'--workdir': None, '--workdir': None,
@ -153,6 +154,7 @@ class CLITestCase(unittest.TestCase):
'--entrypoint': None, '--entrypoint': None,
'--service-ports': None, '--service-ports': None,
'--publish': [], '--publish': [],
'--volume': [],
'--rm': None, '--rm': None,
'--name': None, '--name': None,
'--workdir': None, '--workdir': None,
@ -175,6 +177,7 @@ class CLITestCase(unittest.TestCase):
'--entrypoint': None, '--entrypoint': None,
'--service-ports': None, '--service-ports': None,
'--publish': [], '--publish': [],
'--volume': [],
'--rm': True, '--rm': True,
'--name': None, '--name': None,
'--workdir': None, '--workdir': None,