From c5154d6b2be15b3b12b393db9ff03ae77b32947b Mon Sep 17 00:00:00 2001 From: Joffrey F Date: Tue, 23 Jan 2018 15:25:25 -0800 Subject: [PATCH] Don't break during recreate when a mount target is updated Signed-off-by: Joffrey F --- compose/service.py | 3 +-- tests/integration/service_test.py | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/compose/service.py b/compose/service.py index 0e147194f..b1f7d707b 100644 --- a/compose/service.py +++ b/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'] diff --git a/tests/integration/service_test.py b/tests/integration/service_test.py index e00ae433d..c12724c85 100644 --- a/tests/integration/service_test.py +++ b/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',