Sfoglia il codice sorgente

Added map service ports option for run command.

When using the fig run command, ports defined in fig.yml can be mapped
to the host computer using the -service-ports option.

Signed-off-by: Stephen Quebe <[email protected]>
Stephen Quebe 11 anni fa
parent
commit
cc834aa564
3 ha cambiato i file con 49 aggiunte e 3 eliminazioni
  1. 4 1
      docs/cli.md
  2. 8 2
      fig/cli/main.py
  3. 37 0
      tests/integration/cli_test.py

+ 4 - 1
docs/cli.md

@@ -77,7 +77,7 @@ For example:
 
 By default, linked services will be started, unless they are already running.
 
-One-off commands are started in new containers with the same config as a normal container for that service, so volumes, links, etc will all be created as expected. The only thing different to a normal container is the command will be overridden with the one specified and no ports will be created in case they collide.
+One-off commands are started in new containers with the same config as a normal container for that service, so volumes, links, etc will all be created as expected. The only thing different to a normal container is the command will be overridden with the one specified and by default no ports will be created in case they collide.
 
 Links are also created between one-off commands and the other containers for that service so you can do stuff like this:
 
@@ -87,6 +87,9 @@ If you do not want linked containers to be started when running the one-off comm
 
     $ fig run --no-deps web python manage.py shell
 
+If you want the service's ports to be created and mapped to the host, specify the `--service-ports` flag:
+	$ fig run --service-ports web python manage.py shell
+
 ### scale
 
 Set number of containers to run for a service.

+ 8 - 2
fig/cli/main.py

@@ -278,6 +278,8 @@ class TopLevelCommand(Command):
             -e KEY=VAL            Set an environment variable (can be used multiple times)
             --no-deps             Don't start linked services.
             --rm                  Remove container after run. Ignored in detached mode.
+            --service-ports       Run command with the service's ports enabled and mapped
+                                  to the host.
             -T                    Disable pseudo-tty allocation. By default `fig run`
                                   allocates a TTY.
         """
@@ -325,11 +327,15 @@ class TopLevelCommand(Command):
             insecure_registry=insecure_registry,
             **container_options
         )
+
+        service_ports = None
+        if options['--service-ports']:
+            service_ports = service.options['ports']
         if options['-d']:
-            service.start_container(container, ports=None, one_off=True)
+            service.start_container(container, ports=service_ports, one_off=True)
             print(container.name)
         else:
-            service.start_container(container, ports=None, one_off=True)
+            service.start_container(container, ports=service_ports, one_off=True)
             dockerpty.start(project.client, container.id, interactive=not options['-T'])
             exit_code = container.wait()
             if options['--rm']:

+ 37 - 0
tests/integration/cli_test.py

@@ -237,6 +237,43 @@ class CLITestCase(DockerClientTestCase):
         # make sure a value with a = don't crash out
         self.assertEqual('moto=bobo', container.environment['allo'])
 
+    @patch('dockerpty.start')
+    def test_run_service_without_map_ports(self, __):
+        # create one off container
+        self.command.base_dir = 'tests/fixtures/ports-figfile'
+        self.command.dispatch(['run', '-d', 'simple'], None)
+        container = self.project.get_service('simple').containers(one_off=True)[0]
+
+        # get port information
+        port_random = container.get_local_port(3000)
+        port_assigned = container.get_local_port(3001)
+
+        # close all one off containers we just created
+        container.stop()
+
+        # check the ports
+        self.assertEqual(port_random, None)
+        self.assertEqual(port_assigned, None)
+
+    @patch('dockerpty.start')
+    def test_run_service_with_map_ports(self, __):
+        # create one off container
+        self.command.base_dir = 'tests/fixtures/ports-figfile'
+        self.command.dispatch(['run', '-d', '--service-ports', 'simple'], None)
+        container = self.project.get_service('simple').containers(one_off=True)[0]
+
+        # get port information
+        port_random = container.get_local_port(3000)
+        port_assigned = container.get_local_port(3001)
+
+        # close all one off containers we just created
+        container.stop()
+
+        # check the ports
+        self.assertNotEqual(port_random, None)
+        self.assertIn("0.0.0.0", port_random)
+        self.assertEqual(port_assigned, "0.0.0.0:9999")
+
     def test_rm(self):
         service = self.project.get_service('simple')
         service.create_container()