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',