diff options
author | Samantha Miller <samantha.a.miller123@gmail.com> | 2017-11-12 11:33:34 -0600 |
---|---|---|
committer | Samantha Miller <samantha.a.miller123@gmail.com> | 2017-11-28 18:43:00 -0600 |
commit | c36a2fb1ad9bc026da01bab9d87132f32687e06b (patch) | |
tree | fa7fd04bd93bbfa24a841b97e51811b3e3b8b7a9 | |
parent | c0366b71e9410f228c9839d4d74dd2f36b30b8f9 (diff) |
Added a label option to 'docker-compose run' and test.
Signed-off-by: Samantha Miller <samantha.a.miller123@gmail.com>
-rw-r--r-- | compose/cli/main.py | 9 | ||||
-rw-r--r-- | compose/config/__init__.py | 2 | ||||
-rw-r--r-- | compose/config/config.py | 6 | ||||
-rw-r--r-- | compose/service.py | 5 | ||||
-rw-r--r-- | contrib/completion/bash/docker-compose | 4 | ||||
-rw-r--r-- | tests/acceptance/cli_test.py | 11 | ||||
-rw-r--r-- | tests/fixtures/run-labels/docker-compose.yml | 7 | ||||
-rw-r--r-- | tests/unit/cli_test.py | 4 |
8 files changed, 45 insertions, 3 deletions
diff --git a/compose/cli/main.py b/compose/cli/main.py index c3e30919..32dbf69b 100644 --- a/compose/cli/main.py +++ b/compose/cli/main.py @@ -24,6 +24,7 @@ from ..bundle import MissingDigests from ..bundle import serialize_bundle from ..config import ConfigurationError from ..config import parse_environment +from ..config import parse_labels from ..config import resolve_build_args from ..config.environment import Environment from ..config.serialize import serialize_config @@ -720,7 +721,9 @@ 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] [-v VOLUME...] [-p PORT...] [-e KEY=VAL...] SERVICE [COMMAND] [ARGS...] + Usage: + run [options] [-v VOLUME...] [-p PORT...] [-e KEY=VAL...] [-l KEY=VALUE...] + SERVICE [COMMAND] [ARGS...] Options: -d Detached mode: Run container in the background, print @@ -728,6 +731,7 @@ class TopLevelCommand(object): --name NAME Assign a name to the container --entrypoint CMD Override the entrypoint of the image. -e KEY=VAL Set an environment variable (can be used multiple times) + -l, --label KEY=VAL Add or override a label (can be used multiple times) -u, --user="" Run as specified username or uid --no-deps Don't start linked services. --rm Remove container after run. Ignored in detached mode. @@ -1122,6 +1126,9 @@ def build_container_options(options, detach, command): parse_environment(options['-e']) ) + if options['--label']: + container_options['labels'] = parse_labels(options['--label']) + if options['--entrypoint']: container_options['entrypoint'] = options.get('--entrypoint') diff --git a/compose/config/__init__.py b/compose/config/__init__.py index b629edf6..e1032f3d 100644 --- a/compose/config/__init__.py +++ b/compose/config/__init__.py @@ -8,5 +8,7 @@ from .config import DOCKER_CONFIG_KEYS from .config import find from .config import load from .config import merge_environment +from .config import merge_labels from .config import parse_environment +from .config import parse_labels from .config import resolve_build_args diff --git a/compose/config/config.py b/compose/config/config.py index adfb53d8..c2d10891 100644 --- a/compose/config/config.py +++ b/compose/config/config.py @@ -1075,6 +1075,12 @@ def merge_environment(base, override): return env +def merge_labels(base, override): + labels = parse_labels(base) + labels.update(parse_labels(override)) + return labels + + def split_kv(kvpair): if '=' in kvpair: return kvpair.split('=', 1) diff --git a/compose/service.py b/compose/service.py index 453f982f..2e9587b5 100644 --- a/compose/service.py +++ b/compose/service.py @@ -25,6 +25,7 @@ from . import const from . import progress_stream from .config import DOCKER_CONFIG_KEYS from .config import merge_environment +from .config import merge_labels from .config.errors import DependencyError from .config.types import ServicePort from .config.types import VolumeSpec @@ -778,6 +779,10 @@ class Service(object): self.options.get('environment'), override_options.get('environment')) + container_options['labels'] = merge_labels( + self.options.get('labels'), + override_options.get('labels')) + binds, affinity = merge_volume_bindings( container_options.get('volumes') or [], self.options.get('tmpfs') or [], diff --git a/contrib/completion/bash/docker-compose b/contrib/completion/bash/docker-compose index 1fdb2770..af036817 100644 --- a/contrib/completion/bash/docker-compose +++ b/contrib/completion/bash/docker-compose @@ -403,14 +403,14 @@ _docker_compose_run() { __docker_compose_nospace return ;; - --entrypoint|--name|--user|-u|--volume|-v|--workdir|-w) + --entrypoint|--label|-l|--name|--user|-u|--volume|-v|--workdir|-w) return ;; esac case "$cur" in -*) - COMPREPLY=( $( compgen -W "-d --entrypoint -e --help --name --no-deps --publish -p --rm --service-ports -T --user -u --volume -v --workdir -w" -- "$cur" ) ) + COMPREPLY=( $( compgen -W "-d --entrypoint -e --help --label -l --name --no-deps --publish -p --rm --service-ports -T --user -u --volume -v --workdir -w" -- "$cur" ) ) ;; *) __docker_compose_services_all diff --git a/tests/acceptance/cli_test.py b/tests/acceptance/cli_test.py index 8468dfbd..5987137f 100644 --- a/tests/acceptance/cli_test.py +++ b/tests/acceptance/cli_test.py @@ -1830,6 +1830,17 @@ class CLITestCase(DockerClientTestCase): assert 'FOO=bar' in environment assert 'BAR=baz' not in environment + def test_run_label_flag(self): + self.base_dir = 'tests/fixtures/run-labels' + name = 'service' + self.dispatch(['run', '-l', 'default', '--label', 'foo=baz', name, '/bin/true']) + service = self.project.get_service(name) + container, = service.containers(stopped=True, one_off=OneOffFilter.only) + labels = container.labels + assert labels['default'] == '' + assert labels['foo'] == 'baz' + assert labels['hello'] == 'world' + def test_rm(self): service = self.project.get_service('simple') service.create_container() diff --git a/tests/fixtures/run-labels/docker-compose.yml b/tests/fixtures/run-labels/docker-compose.yml new file mode 100644 index 00000000..e8cd5006 --- /dev/null +++ b/tests/fixtures/run-labels/docker-compose.yml @@ -0,0 +1,7 @@ +service: + image: busybox:latest + command: top + + labels: + foo: bar + hello: world diff --git a/tests/unit/cli_test.py b/tests/unit/cli_test.py index 1a324f50..c6aa75b2 100644 --- a/tests/unit/cli_test.py +++ b/tests/unit/cli_test.py @@ -114,6 +114,7 @@ class CLITestCase(unittest.TestCase): 'SERVICE': 'service', 'COMMAND': None, '-e': [], + '--label': [], '--user': None, '--no-deps': None, '-d': False, @@ -150,6 +151,7 @@ class CLITestCase(unittest.TestCase): 'SERVICE': 'service', 'COMMAND': None, '-e': [], + '--label': [], '--user': None, '--no-deps': None, '-d': True, @@ -173,6 +175,7 @@ class CLITestCase(unittest.TestCase): 'SERVICE': 'service', 'COMMAND': None, '-e': [], + '--label': [], '--user': None, '--no-deps': None, '-d': True, @@ -205,6 +208,7 @@ class CLITestCase(unittest.TestCase): 'SERVICE': 'service', 'COMMAND': None, '-e': [], + '--label': [], '--user': None, '--no-deps': None, '-d': True, |