Prechádzať zdrojové kódy

Add -w or --workdir to compose run to override workdir from commandline

Signed-off-by: Simon van der Veldt <[email protected]>
Simon van der Veldt 9 rokov pred
rodič
commit
658803edf8

+ 4 - 0
compose/cli/main.py

@@ -527,6 +527,7 @@ class TopLevelCommand(object):
                                   to the host.
                                   to the host.
             -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
         """
         """
         service = self.project.get_service(options['SERVICE'])
         service = self.project.get_service(options['SERVICE'])
         detach = options['-d']
         detach = options['-d']
@@ -576,6 +577,9 @@ class TopLevelCommand(object):
         if options['--name']:
         if options['--name']:
             container_options['name'] = options['--name']
             container_options['name'] = options['--name']
 
 
+        if options['--workdir']:
+            container_options['working_dir'] = options['--workdir']
+
         run_one_off_container(container_options, self.project, service, options)
         run_one_off_container(container_options, self.project, service, options)
 
 
     def scale(self, options):
     def scale(self, options):

+ 1 - 0
docs/reference/run.md

@@ -26,6 +26,7 @@ Options:
 -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 to the host.
 --service-ports       Run command with the service's ports enabled and mapped to the host.
 -T                    Disable pseudo-tty allocation. By default `docker-compose run` allocates a TTY.
 -T                    Disable pseudo-tty allocation. By default `docker-compose run` allocates a TTY.
+-w, --workdir=""      Working directory inside the container
 ```
 ```
 
 
 Runs a one-time command against a service. For example, the following command starts the `web` service and runs `bash` as its command.
 Runs a one-time command against a service. For example, the following command starts the `web` service and runs `bash` as its command.

+ 18 - 0
tests/acceptance/cli_test.py

@@ -1025,6 +1025,24 @@ class CLITestCase(DockerClientTestCase):
         container, = service.containers(stopped=True, one_off=True)
         container, = service.containers(stopped=True, one_off=True)
         self.assertEqual(container.name, name)
         self.assertEqual(container.name, name)
 
 
+    def test_run_service_with_workdir_overridden(self):
+        self.base_dir = 'tests/fixtures/run-workdir'
+        name = 'service'
+        workdir = '/var'
+        self.dispatch(['run', '--workdir={workdir}'.format(workdir=workdir), name])
+        service = self.project.get_service(name)
+        container = service.containers(stopped=True, one_off=True)[0]
+        self.assertEqual(workdir, container.get('Config.WorkingDir'))
+
+    def test_run_service_with_workdir_overridden_short_form(self):
+        self.base_dir = 'tests/fixtures/run-workdir'
+        name = 'service'
+        workdir = '/var'
+        self.dispatch(['run', '-w', workdir, name])
+        service = self.project.get_service(name)
+        container = service.containers(stopped=True, one_off=True)[0]
+        self.assertEqual(workdir, container.get('Config.WorkingDir'))
+
     @v2_only()
     @v2_only()
     def test_run_interactive_connects_to_network(self):
     def test_run_interactive_connects_to_network(self):
         self.base_dir = 'tests/fixtures/networks'
         self.base_dir = 'tests/fixtures/networks'

+ 4 - 0
tests/fixtures/run-workdir/docker-compose.yml

@@ -0,0 +1,4 @@
+service:
+  image: busybox:latest
+  working_dir: /etc
+  command: /bin/true

+ 3 - 0
tests/unit/cli_test.py

@@ -102,6 +102,7 @@ class CLITestCase(unittest.TestCase):
                 '--publish': [],
                 '--publish': [],
                 '--rm': None,
                 '--rm': None,
                 '--name': None,
                 '--name': None,
+                '--workdir': None,
             })
             })
 
 
         _, _, call_kwargs = mock_run_operation.mock_calls[0]
         _, _, call_kwargs = mock_run_operation.mock_calls[0]
@@ -135,6 +136,7 @@ class CLITestCase(unittest.TestCase):
             '--publish': [],
             '--publish': [],
             '--rm': None,
             '--rm': None,
             '--name': None,
             '--name': None,
+            '--workdir': None,
         })
         })
 
 
         self.assertEquals(
         self.assertEquals(
@@ -156,6 +158,7 @@ class CLITestCase(unittest.TestCase):
             '--publish': [],
             '--publish': [],
             '--rm': True,
             '--rm': True,
             '--name': None,
             '--name': None,
+            '--workdir': None,
         })
         })
 
 
         self.assertFalse(
         self.assertFalse(