summaryrefslogtreecommitdiff
path: root/compose/service.py
diff options
context:
space:
mode:
authorEric Hripko <ehripko@bloomberg.net>2020-05-15 14:32:18 +0100
committerEric Hripko <ehripko@bloomberg.net>2020-08-06 23:11:39 +0100
commit06462cd604d29ca88bb73a1a030b2e4f58c2d2a3 (patch)
tree621d7f2f3e62af7266f1fa37aa1e308bf3394f32 /compose/service.py
parent52d2fcc27479ffe3301c332fb971296ab686255a (diff)
Make run behave in the same way as up
Signed-off-by: Eric Hripko <ehripko@bloomberg.net>
Diffstat (limited to 'compose/service.py')
-rw-r--r--compose/service.py35
1 files changed, 27 insertions, 8 deletions
diff --git a/compose/service.py b/compose/service.py
index 673b0b33..50b00279 100644
--- a/compose/service.py
+++ b/compose/service.py
@@ -388,9 +388,12 @@ class Service(object):
platform = self.default_platform
return platform
- def convergence_plan(self, strategy=ConvergenceStrategy.changed):
+ def convergence_plan(self, strategy=ConvergenceStrategy.changed, one_off=False):
containers = self.containers(stopped=True)
+ if one_off:
+ return ConvergencePlan('one_off', [])
+
if not containers:
return ConvergencePlan('create', [])
@@ -439,25 +442,37 @@ class Service(object):
return has_diverged
- def _execute_convergence_create(self, scale, detached, start):
+ def _execute_convergence_create(self, scale, detached, start, one_off=False, override_options=None):
i = self._next_container_number()
def create_and_start(service, n):
- container = service.create_container(number=n, quiet=True)
+ if one_off:
+ container = service.create_container(one_off=True, quiet=True, **override_options)
+ else:
+ container = service.create_container(number=n, quiet=True)
if not detached:
container.attach_log_stream()
- if start:
+ if start and not one_off:
self.start_container(container)
return container
+ def get_name(service_name):
+ if one_off:
+ return "_".join([
+ service_name.project,
+ service_name.service,
+ "run",
+ ])
+ return self.get_container_name(service_name.service, service_name.number)
+
containers, errors = parallel_execute(
[
ServiceName(self.project, self.name, index)
for index in range(i, i + scale)
],
lambda service_name: create_and_start(self, service_name.number),
- lambda service_name: self.get_container_name(service_name.service, service_name.number),
+ get_name,
"Creating"
)
for error in errors.values():
@@ -528,16 +543,20 @@ class Service(object):
def execute_convergence_plan(self, plan, timeout=None, detached=False,
start=True, scale_override=None,
rescale=True, reset_container_image=False,
- renew_anonymous_volumes=False):
+ renew_anonymous_volumes=False, override_options=None):
(action, containers) = plan
scale = scale_override if scale_override is not None else self.scale_num
containers = sorted(containers, key=attrgetter('number'))
self.show_scale_warnings(scale)
- if action == 'create':
+ if action in ['create', 'one_off']:
return self._execute_convergence_create(
- scale, detached, start
+ scale,
+ detached,
+ start,
+ one_off=(action == 'one_off'),
+ override_options=override_options
)
# The create action needs always needs an initial scale, but otherwise,