Procházet zdrojové kódy

Merge pull request #5699 from docker/pantuza-cli-add-detach-option

Add long-form --detach CLI flag
Joffrey F před 8 roky
rodič
revize
2fa201660c

+ 9 - 9
compose/cli/main.py

@@ -426,7 +426,7 @@ class TopLevelCommand(object):
         Usage: exec [options] [-e KEY=VAL...] SERVICE COMMAND [ARGS...]
         Usage: exec [options] [-e KEY=VAL...] SERVICE COMMAND [ARGS...]
 
 
         Options:
         Options:
-            -d                Detached mode: Run command in the background.
+            -d, --detach      Detached mode: Run command in the background.
             --privileged      Give extended privileges to the process.
             --privileged      Give extended privileges to the process.
             -u, --user USER   Run the command as this user.
             -u, --user USER   Run the command as this user.
             -T                Disable pseudo-tty allocation. By default `docker-compose exec`
             -T                Disable pseudo-tty allocation. By default `docker-compose exec`
@@ -440,7 +440,7 @@ class TopLevelCommand(object):
         use_cli = not environment.get_boolean('COMPOSE_INTERACTIVE_NO_CLI')
         use_cli = not environment.get_boolean('COMPOSE_INTERACTIVE_NO_CLI')
         index = int(options.get('--index'))
         index = int(options.get('--index'))
         service = self.project.get_service(options['SERVICE'])
         service = self.project.get_service(options['SERVICE'])
-        detach = options['-d']
+        detach = options.get('--detach')
 
 
         if options['--env'] and docker.utils.version_lt(self.project.client.api_version, '1.25'):
         if options['--env'] and docker.utils.version_lt(self.project.client.api_version, '1.25'):
             raise UserError("Setting environment for exec is not supported in API < 1.25'")
             raise UserError("Setting environment for exec is not supported in API < 1.25'")
@@ -764,7 +764,7 @@ class TopLevelCommand(object):
                 SERVICE [COMMAND] [ARGS...]
                 SERVICE [COMMAND] [ARGS...]
 
 
         Options:
         Options:
-            -d                    Detached mode: Run container in the background, print
+            -d, --detach          Detached mode: Run container in the background, print
                                   new container name.
                                   new container name.
             --name NAME           Assign a name to the container
             --name NAME           Assign a name to the container
             --entrypoint CMD      Override the entrypoint of the image.
             --entrypoint CMD      Override the entrypoint of the image.
@@ -782,7 +782,7 @@ class TopLevelCommand(object):
             -w, --workdir=""      Working directory inside the container
             -w, --workdir=""      Working directory inside the container
         """
         """
         service = self.project.get_service(options['SERVICE'])
         service = self.project.get_service(options['SERVICE'])
-        detach = options['-d']
+        detach = options.get('--detach')
 
 
         if options['--publish'] and options['--service-ports']:
         if options['--publish'] and options['--service-ports']:
             raise UserError(
             raise UserError(
@@ -930,7 +930,7 @@ class TopLevelCommand(object):
         Usage: up [options] [--scale SERVICE=NUM...] [SERVICE...]
         Usage: up [options] [--scale SERVICE=NUM...] [SERVICE...]
 
 
         Options:
         Options:
-            -d                         Detached mode: Run containers in the background,
+            -d, --detach               Detached mode: Run containers in the background,
                                        print new container names. Incompatible with
                                        print new container names. Incompatible with
                                        --abort-on-container-exit.
                                        --abort-on-container-exit.
             --no-color                 Produce monochrome output.
             --no-color                 Produce monochrome output.
@@ -965,7 +965,7 @@ class TopLevelCommand(object):
         service_names = options['SERVICE']
         service_names = options['SERVICE']
         timeout = timeout_from_opts(options)
         timeout = timeout_from_opts(options)
         remove_orphans = options['--remove-orphans']
         remove_orphans = options['--remove-orphans']
-        detached = options.get('-d')
+        detached = options.get('--detach')
         no_start = options.get('--no-start')
         no_start = options.get('--no-start')
 
 
         if detached and (cascade_stop or exit_value_from):
         if detached and (cascade_stop or exit_value_from):
@@ -977,7 +977,7 @@ class TopLevelCommand(object):
         if ignore_orphans and remove_orphans:
         if ignore_orphans and remove_orphans:
             raise UserError("COMPOSE_IGNORE_ORPHANS and --remove-orphans cannot be combined.")
             raise UserError("COMPOSE_IGNORE_ORPHANS and --remove-orphans cannot be combined.")
 
 
-        opts = ['-d', '--abort-on-container-exit', '--exit-code-from']
+        opts = ['--detach', '--abort-on-container-exit', '--exit-code-from']
         for excluded in [x for x in opts if options.get(x) and no_start]:
         for excluded in [x for x in opts if options.get(x) and no_start]:
             raise UserError('--no-start and {} cannot be combined.'.format(excluded))
             raise UserError('--no-start and {} cannot be combined.'.format(excluded))
 
 
@@ -1247,7 +1247,7 @@ def run_one_off_container(container_options, project, service, options, project_
         one_off=True,
         one_off=True,
         **container_options)
         **container_options)
 
 
-    if options['-d']:
+    if options.get('--detach'):
         service.start_container(container)
         service.start_container(container)
         print(container.name)
         print(container.name)
         return
         return
@@ -1374,7 +1374,7 @@ def parse_scale_args(options):
 def build_exec_command(options, container_id, command):
 def build_exec_command(options, container_id, command):
     args = ["exec"]
     args = ["exec"]
 
 
-    if options["-d"]:
+    if options["--detach"]:
         args += ["--detach"]
         args += ["--detach"]
     else:
     else:
         args += ["--interactive"]
         args += ["--interactive"]

+ 3 - 3
contrib/completion/bash/docker-compose

@@ -245,7 +245,7 @@ _docker_compose_exec() {
 
 
 	case "$cur" in
 	case "$cur" in
 		-*)
 		-*)
-			COMPREPLY=( $( compgen -W "-d --help --index --privileged -T --user -u" -- "$cur" ) )
+			COMPREPLY=( $( compgen -W "-d --detach --help --index --privileged -T --user -u" -- "$cur" ) )
 			;;
 			;;
 		*)
 		*)
 			__docker_compose_services_running
 			__docker_compose_services_running
@@ -444,7 +444,7 @@ _docker_compose_run() {
 
 
 	case "$cur" in
 	case "$cur" in
 		-*)
 		-*)
-			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" ) )
+			COMPREPLY=( $( compgen -W "-d --detach --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
 			__docker_compose_services_all
@@ -552,7 +552,7 @@ _docker_compose_up() {
 
 
 	case "$cur" in
 	case "$cur" in
 		-*)
 		-*)
-			COMPREPLY=( $( compgen -W "--abort-on-container-exit --always-recreate-deps --build -d --exit-code-from --force-recreate --help --no-build --no-color --no-deps --no-recreate --no-start --renew-anon-volumes -V --remove-orphans --scale --timeout -t" -- "$cur" ) )
+			COMPREPLY=( $( compgen -W "--abort-on-container-exit --always-recreate-deps --build -d --detach --exit-code-from --force-recreate --help --no-build --no-color --no-deps --no-recreate --no-start --renew-anon-volumes -V --remove-orphans --scale --timeout -t" -- "$cur" ) )
 			;;
 			;;
 		*)
 		*)
 			__docker_compose_services_all
 			__docker_compose_services_all

+ 22 - 0
tests/acceptance/cli_test.py

@@ -911,6 +911,19 @@ class CLITestCase(DockerClientTestCase):
         assert not container.get('Config.AttachStdout')
         assert not container.get('Config.AttachStdout')
         assert not container.get('Config.AttachStdin')
         assert not container.get('Config.AttachStdin')
 
 
+    def test_up_detached_long_form(self):
+        self.dispatch(['up', '--detach'])
+        service = self.project.get_service('simple')
+        another = self.project.get_service('another')
+        assert len(service.containers()) == 1
+        assert len(another.containers()) == 1
+
+        # Ensure containers don't have stdin and stdout connected in -d mode
+        container, = service.containers()
+        assert not container.get('Config.AttachStderr')
+        assert not container.get('Config.AttachStdout')
+        assert not container.get('Config.AttachStdin')
+
     def test_up_attached(self):
     def test_up_attached(self):
         self.base_dir = 'tests/fixtures/echo-services'
         self.base_dir = 'tests/fixtures/echo-services'
         result = self.dispatch(['up', '--no-color'])
         result = self.dispatch(['up', '--no-color'])
@@ -1490,6 +1503,15 @@ class CLITestCase(DockerClientTestCase):
         assert stderr == ""
         assert stderr == ""
         assert stdout == "/\n"
         assert stdout == "/\n"
 
 
+    def test_exec_detach_long_form(self):
+        self.base_dir = 'tests/fixtures/links-composefile'
+        self.dispatch(['up', '--detach', 'console'])
+        assert len(self.project.containers()) == 1
+
+        stdout, stderr = self.dispatch(['exec', '-T', 'console', 'ls', '-1d', '/'])
+        assert stderr == ""
+        assert stdout == "/\n"
+
     def test_exec_custom_user(self):
     def test_exec_custom_user(self):
         self.base_dir = 'tests/fixtures/links-composefile'
         self.base_dir = 'tests/fixtures/links-composefile'
         self.dispatch(['up', '-d', 'console'])
         self.dispatch(['up', '-d', 'console'])

+ 4 - 4
tests/unit/cli_test.py

@@ -119,7 +119,7 @@ class CLITestCase(unittest.TestCase):
                 '--label': [],
                 '--label': [],
                 '--user': None,
                 '--user': None,
                 '--no-deps': None,
                 '--no-deps': None,
-                '-d': False,
+                '--detach': False,
                 '-T': None,
                 '-T': None,
                 '--entrypoint': None,
                 '--entrypoint': None,
                 '--service-ports': None,
                 '--service-ports': None,
@@ -156,7 +156,7 @@ class CLITestCase(unittest.TestCase):
             '--label': [],
             '--label': [],
             '--user': None,
             '--user': None,
             '--no-deps': None,
             '--no-deps': None,
-            '-d': True,
+            '--detach': True,
             '-T': None,
             '-T': None,
             '--entrypoint': None,
             '--entrypoint': None,
             '--service-ports': None,
             '--service-ports': None,
@@ -177,7 +177,7 @@ class CLITestCase(unittest.TestCase):
             '--label': [],
             '--label': [],
             '--user': None,
             '--user': None,
             '--no-deps': None,
             '--no-deps': None,
-            '-d': True,
+            '--detach': True,
             '-T': None,
             '-T': None,
             '--entrypoint': None,
             '--entrypoint': None,
             '--service-ports': None,
             '--service-ports': None,
@@ -208,7 +208,7 @@ class CLITestCase(unittest.TestCase):
                 '--label': [],
                 '--label': [],
                 '--user': None,
                 '--user': None,
                 '--no-deps': None,
                 '--no-deps': None,
-                '-d': True,
+                '--detach': True,
                 '-T': None,
                 '-T': None,
                 '--entrypoint': None,
                 '--entrypoint': None,
                 '--service-ports': True,
                 '--service-ports': True,