diff --git a/compose/cli/main.py b/compose/cli/main.py index 62de35fec..5e077abe9 100644 --- a/compose/cli/main.py +++ b/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): diff --git a/compose/service.py b/compose/service.py index 85aa74f26..b9f9af2cd 100644 --- a/compose/service.py +++ b/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()) | diff --git a/tests/acceptance/cli_test.py b/tests/acceptance/cli_test.py index a8d93bfe8..7a0f22fc3 100644 --- a/tests/acceptance/cli_test.py +++ b/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' diff --git a/tests/unit/cli_test.py b/tests/unit/cli_test.py index cef53740d..47eaabf9d 100644 --- a/tests/unit/cli_test.py +++ b/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,