ソースを参照

Merge pull request #5725 from docker/geigerzaehler-run-with-network-alias

Add --use-aliases flag to run command
Joffrey F 8 年 前
コミット
4ceeaad089
4 ファイル変更39 行追加11 行削除
  1. 7 3
      compose/cli/main.py
  2. 6 8
      compose/service.py
  3. 22 0
      tests/acceptance/cli_test.py
  4. 4 0
      tests/unit/cli_test.py

+ 7 - 3
compose/cli/main.py

@@ -803,6 +803,8 @@ class TopLevelCommand(object):
             -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.
+            --use-aliases         Use the service's network aliases in the network(s) the
+                                  container connects to.
             -v, --volume=[]       Bind mount a volume (default [])
             -T                    Disable pseudo-tty allocation. By default `docker-compose run`
                                   allocates a TTY.
@@ -1281,8 +1283,10 @@ def run_one_off_container(container_options, project, service, options, toplevel
         one_off=True,
         **container_options)
 
+    use_network_aliases = options['--use-aliases']
+
     if options.get('--detach'):
-        service.start_container(container)
+        service.start_container(container, use_network_aliases)
         print(container.name)
         return
 
@@ -1298,7 +1302,7 @@ def run_one_off_container(container_options, project, service, options, toplevel
     try:
         try:
             if IS_WINDOWS_PLATFORM or use_cli:
-                service.connect_container_to_networks(container)
+                service.connect_container_to_networks(container, use_network_aliases)
                 exit_code = call_docker(
                     ["start", "--attach", "--interactive", container.id],
                     toplevel_options
@@ -1312,7 +1316,7 @@ def run_one_off_container(container_options, project, service, options, toplevel
                 )
                 pty = PseudoTerminal(project.client, operation)
                 sockets = pty.sockets()
-                service.start_container(container)
+                service.start_container(container, use_network_aliases)
                 pty.start(sockets)
                 exit_code = container.wait()
         except (signals.ShutdownException):

+ 6 - 8
compose/service.py

@@ -557,8 +557,8 @@ class Service(object):
                 container.attach_log_stream()
             return self.start_container(container)
 
-    def start_container(self, container):
-        self.connect_container_to_networks(container)
+    def start_container(self, container, use_network_aliases=True):
+        self.connect_container_to_networks(container, use_network_aliases)
         try:
             container.start()
         except APIError as ex:
@@ -574,7 +574,7 @@ class Service(object):
             )
         )
 
-    def connect_container_to_networks(self, container):
+    def connect_container_to_networks(self, container, use_network_aliases=True):
         connected_networks = container.get('NetworkSettings.Networks')
 
         for network, netdefs in self.prioritized_networks.items():
@@ -583,10 +583,11 @@ class Service(object):
                     continue
                 self.client.disconnect_container_from_network(container.id, network)
 
-            log.debug('Connecting to {}'.format(network))
+            aliases = self._get_aliases(netdefs, container) if use_network_aliases else []
+
             self.client.connect_container_to_network(
                 container.id, network,
-                aliases=self._get_aliases(netdefs, container),
+                aliases=aliases,
                 ipv4_address=netdefs.get('ipv4_address', None),
                 ipv6_address=netdefs.get('ipv6_address', None),
                 links=self._get_links(False),
@@ -692,9 +693,6 @@ class Service(object):
         return 1 if not numbers else max(numbers) + 1
 
     def _get_aliases(self, network, container=None):
-        if container and container.labels.get(LABEL_ONE_OFF) == "True":
-            return []
-
         return list(
             {self.name} |
             ({container.short_id} if container else set()) |

+ 22 - 0
tests/acceptance/cli_test.py

@@ -1915,6 +1915,28 @@ class CLITestCase(DockerClientTestCase):
         container = service.containers(stopped=True, one_off=True)[0]
         assert workdir == container.get('Config.WorkingDir')
 
+    @v2_only()
+    def test_run_service_with_use_aliases(self):
+        filename = 'network-aliases.yml'
+        self.base_dir = 'tests/fixtures/networks'
+        self.dispatch(['-f', filename, 'run', '-d', '--use-aliases', 'web', 'top'])
+
+        back_name = '{}_back'.format(self.project.name)
+        front_name = '{}_front'.format(self.project.name)
+
+        web_container = self.project.get_service('web').containers(one_off=OneOffFilter.only)[0]
+
+        back_aliases = web_container.get(
+            'NetworkSettings.Networks.{}.Aliases'.format(back_name)
+        )
+        assert 'web' in back_aliases
+        front_aliases = web_container.get(
+            'NetworkSettings.Networks.{}.Aliases'.format(front_name)
+        )
+        assert 'web' in front_aliases
+        assert 'forward_facing' in front_aliases
+        assert 'ahead' in front_aliases
+
     @v2_only()
     def test_run_interactive_connects_to_network(self):
         self.base_dir = 'tests/fixtures/networks'

+ 4 - 0
tests/unit/cli_test.py

@@ -124,6 +124,7 @@ class CLITestCase(unittest.TestCase):
                 '-T': None,
                 '--entrypoint': None,
                 '--service-ports': None,
+                '--use-aliases': None,
                 '--publish': [],
                 '--volume': [],
                 '--rm': None,
@@ -162,6 +163,7 @@ class CLITestCase(unittest.TestCase):
             '-T': None,
             '--entrypoint': None,
             '--service-ports': None,
+            '--use-aliases': None,
             '--publish': [],
             '--volume': [],
             '--rm': None,
@@ -183,6 +185,7 @@ class CLITestCase(unittest.TestCase):
             '-T': None,
             '--entrypoint': None,
             '--service-ports': None,
+            '--use-aliases': None,
             '--publish': [],
             '--volume': [],
             '--rm': True,
@@ -214,6 +217,7 @@ class CLITestCase(unittest.TestCase):
                 '-T': None,
                 '--entrypoint': None,
                 '--service-ports': True,
+                '--use-aliases': None,
                 '--publish': ['80:80'],
                 '--rm': None,
                 '--name': None,