mirror of https://github.com/docker/compose.git
Prevent dependencies rescaling when executing `docker-compose run`
Signed-off-by: Joffrey F <joffrey@docker.com>
This commit is contained in:
parent
50437bd6ea
commit
9daced4c04
|
@ -1138,7 +1138,9 @@ def run_one_off_container(container_options, project, service, options):
|
||||||
project.up(
|
project.up(
|
||||||
service_names=deps,
|
service_names=deps,
|
||||||
start_deps=True,
|
start_deps=True,
|
||||||
strategy=ConvergenceStrategy.never)
|
strategy=ConvergenceStrategy.never,
|
||||||
|
rescale=False
|
||||||
|
)
|
||||||
|
|
||||||
project.initialize()
|
project.initialize()
|
||||||
|
|
||||||
|
|
|
@ -382,7 +382,8 @@ class Project(object):
|
||||||
timeout=None,
|
timeout=None,
|
||||||
detached=False,
|
detached=False,
|
||||||
remove_orphans=False,
|
remove_orphans=False,
|
||||||
scale_override=None):
|
scale_override=None,
|
||||||
|
rescale=True):
|
||||||
|
|
||||||
warn_for_swarm_mode(self.client)
|
warn_for_swarm_mode(self.client)
|
||||||
|
|
||||||
|
@ -405,7 +406,8 @@ class Project(object):
|
||||||
plans[service.name],
|
plans[service.name],
|
||||||
timeout=timeout,
|
timeout=timeout,
|
||||||
detached=detached,
|
detached=detached,
|
||||||
scale_override=scale_override.get(service.name)
|
scale_override=scale_override.get(service.name),
|
||||||
|
rescale=rescale
|
||||||
)
|
)
|
||||||
|
|
||||||
def get_deps(service):
|
def get_deps(service):
|
||||||
|
|
|
@ -390,7 +390,7 @@ class Service(object):
|
||||||
return containers
|
return containers
|
||||||
|
|
||||||
def _execute_convergence_recreate(self, containers, scale, timeout, detached, start):
|
def _execute_convergence_recreate(self, containers, scale, timeout, detached, start):
|
||||||
if len(containers) > scale:
|
if scale is not None and len(containers) > scale:
|
||||||
self._downscale(containers[scale:], timeout)
|
self._downscale(containers[scale:], timeout)
|
||||||
containers = containers[:scale]
|
containers = containers[:scale]
|
||||||
|
|
||||||
|
@ -408,14 +408,14 @@ class Service(object):
|
||||||
for error in errors.values():
|
for error in errors.values():
|
||||||
raise OperationFailedError(error)
|
raise OperationFailedError(error)
|
||||||
|
|
||||||
if len(containers) < scale:
|
if scale is not None and len(containers) < scale:
|
||||||
containers.extend(self._execute_convergence_create(
|
containers.extend(self._execute_convergence_create(
|
||||||
scale - len(containers), detached, start
|
scale - len(containers), detached, start
|
||||||
))
|
))
|
||||||
return containers
|
return containers
|
||||||
|
|
||||||
def _execute_convergence_start(self, containers, scale, timeout, detached, start):
|
def _execute_convergence_start(self, containers, scale, timeout, detached, start):
|
||||||
if len(containers) > scale:
|
if scale is not None and len(containers) > scale:
|
||||||
self._downscale(containers[scale:], timeout)
|
self._downscale(containers[scale:], timeout)
|
||||||
containers = containers[:scale]
|
containers = containers[:scale]
|
||||||
if start:
|
if start:
|
||||||
|
@ -429,7 +429,7 @@ class Service(object):
|
||||||
for error in errors.values():
|
for error in errors.values():
|
||||||
raise OperationFailedError(error)
|
raise OperationFailedError(error)
|
||||||
|
|
||||||
if len(containers) < scale:
|
if scale is not None and len(containers) < scale:
|
||||||
containers.extend(self._execute_convergence_create(
|
containers.extend(self._execute_convergence_create(
|
||||||
scale - len(containers), detached, start
|
scale - len(containers), detached, start
|
||||||
))
|
))
|
||||||
|
@ -448,7 +448,7 @@ class Service(object):
|
||||||
)
|
)
|
||||||
|
|
||||||
def execute_convergence_plan(self, plan, timeout=None, detached=False,
|
def execute_convergence_plan(self, plan, timeout=None, detached=False,
|
||||||
start=True, scale_override=None):
|
start=True, scale_override=None, rescale=True):
|
||||||
(action, containers) = plan
|
(action, containers) = plan
|
||||||
scale = scale_override if scale_override is not None else self.scale_num
|
scale = scale_override if scale_override is not None else self.scale_num
|
||||||
containers = sorted(containers, key=attrgetter('number'))
|
containers = sorted(containers, key=attrgetter('number'))
|
||||||
|
@ -460,6 +460,11 @@ class Service(object):
|
||||||
scale, detached, start
|
scale, detached, start
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# The create action needs always needs an initial scale, but otherwise,
|
||||||
|
# we set scale to none in no-rescale scenarios (`run` dependencies)
|
||||||
|
if not rescale:
|
||||||
|
scale = None
|
||||||
|
|
||||||
if action == 'recreate':
|
if action == 'recreate':
|
||||||
return self._execute_convergence_recreate(
|
return self._execute_convergence_recreate(
|
||||||
containers, scale, timeout, detached, start
|
containers, scale, timeout, detached, start
|
||||||
|
|
|
@ -1211,6 +1211,17 @@ class CLITestCase(DockerClientTestCase):
|
||||||
self.assertEqual(len(db.containers()), 1)
|
self.assertEqual(len(db.containers()), 1)
|
||||||
self.assertEqual(len(console.containers()), 0)
|
self.assertEqual(len(console.containers()), 0)
|
||||||
|
|
||||||
|
def test_run_service_with_scaled_dependencies(self):
|
||||||
|
self.base_dir = 'tests/fixtures/v2-dependencies'
|
||||||
|
self.dispatch(['up', '-d', '--scale', 'db=2', '--scale', 'console=0'])
|
||||||
|
db = self.project.get_service('db')
|
||||||
|
console = self.project.get_service('console')
|
||||||
|
assert len(db.containers()) == 2
|
||||||
|
assert len(console.containers()) == 0
|
||||||
|
self.dispatch(['run', 'web', '/bin/true'], None)
|
||||||
|
assert len(db.containers()) == 2
|
||||||
|
assert len(console.containers()) == 0
|
||||||
|
|
||||||
def test_run_with_no_deps(self):
|
def test_run_with_no_deps(self):
|
||||||
self.base_dir = 'tests/fixtures/links-composefile'
|
self.base_dir = 'tests/fixtures/links-composefile'
|
||||||
self.dispatch(['run', '--no-deps', 'web', '/bin/true'])
|
self.dispatch(['run', '--no-deps', 'web', '/bin/true'])
|
||||||
|
|
Loading…
Reference in New Issue