Procházet zdrojové kódy

Scale restarts stopped containers

This is existing behaviour and should be kept.

Signed-off-by: Mazz Mosley <[email protected]>
Mazz Mosley před 10 roky
rodič
revize
e1c1a4c0aa
1 změnil soubory, kde provedl 34 přidání a 10 odebrání
  1. 34 10
      compose/service.py

+ 34 - 10
compose/service.py

@@ -176,6 +176,30 @@ class Service(object):
             return
 
         if desired_num > num_running:
+            # we need to start/create until we have desired_num
+            all_containers = self.containers(stopped=True)
+
+            if num_running != len(all_containers):
+                # we have some stopped containers, let's start them up again
+                stopped_containers = sorted([c for c in all_containers if not c.is_running], key=attrgetter('number'))
+
+                num_stopped = len(stopped_containers)
+
+                if num_stopped + num_running > desired_num:
+                    num_to_start = desired_num - num_running
+                    containers_to_start = stopped_containers[:num_to_start]
+                else:
+                    containers_to_start = stopped_containers
+
+                parallel_execute(
+                    objects=containers_to_start,
+                    obj_callable=lambda c: c.start(),
+                    msg_index=lambda c: c.name,
+                    msg="Starting"
+                )
+
+                num_running += len(containers_to_start)
+
             num_to_create = desired_num - num_running
             next_number = self._next_container_number()
             container_numbers = [
@@ -202,18 +226,18 @@ class Service(object):
                 msg_index=lambda c: c.name,
                 msg="Stopping"
             )
-            parallel_execute(
-                objects=containers_to_stop,
-                obj_callable=lambda c: c.remove(),
-                msg_index=lambda c: c.name,
-                msg="Removing"
-            )
+
+        self.remove_stopped()
 
     def remove_stopped(self, **options):
-        for c in self.containers(stopped=True):
-            if not c.is_running:
-                log.info("Removing %s..." % c.name)
-                c.remove(**options)
+        containers = [c for c in self.containers(stopped=True) if not c.is_running]
+
+        parallel_execute(
+            objects=containers,
+            obj_callable=lambda c: c.remove(**options),
+            msg_index=lambda c: c.name,
+            msg="Removing"
+        )
 
     def create_container(self,
                          one_off=False,