Преглед изворни кода

Don't break during recreate when a mount target is updated

Signed-off-by: Joffrey F <[email protected]>
Joffrey F пре 7 година
родитељ
комит
c5154d6b2b
2 измењених фајлова са 23 додато и 2 уклоњено
  1. 1 2
      compose/service.py
  2. 22 0
      tests/integration/service_test.py

+ 1 - 2
compose/service.py

@@ -1322,7 +1322,6 @@ def get_container_data_volumes(container, volumes_option, tmpfs_option, mounts_o
         a mapping of volume bindings for those volumes.
         Anonymous volume mounts are updated in place instead.
     """
-
     volumes = []
     volumes_option = volumes_option or []
 
@@ -1366,7 +1365,7 @@ def get_container_data_volumes(container, volumes_option, tmpfs_option, mounts_o
             continue
 
         ctnr_mount = container_mounts.get(mount.target)
-        if not ctnr_mount.get('Name'):
+        if not ctnr_mount or not ctnr_mount.get('Name'):
             continue
 
         mount.source = ctnr_mount['Name']

+ 22 - 0
tests/integration/service_test.py

@@ -487,6 +487,28 @@ class ServiceTest(DockerClientTestCase):
         with pytest.raises(APIError):
             self.client.inspect_container(old_container.id)
 
+    def test_execute_convergence_plan_recreate_change_mount_target(self):
+        service = self.create_service(
+            'db',
+            volumes=[MountSpec(target='/app1', type='volume')],
+            entrypoint=['top'], command=['-d', '1']
+        )
+        old_container = create_and_start_container(service)
+        assert (
+            [mount['Destination'] for mount in old_container.get('Mounts')] ==
+            ['/app1']
+        )
+        service.options['volumes'] = [MountSpec(target='/app2', type='volume')]
+
+        new_container, = service.execute_convergence_plan(
+            ConvergencePlan('recreate', [old_container])
+        )
+
+        assert (
+            [mount['Destination'] for mount in new_container.get('Mounts')] ==
+            ['/app2']
+        )
+
     def test_execute_convergence_plan_recreate_twice(self):
         service = self.create_service(
             'db',