From ccde3dc66b5129baa3f6a85f0cf1cb67a0b11cb8 Mon Sep 17 00:00:00 2001 From: Felix Fontein Date: Sat, 6 Oct 2018 15:50:12 +0200 Subject: [PATCH] docker_container: fix behavior when image is not specified (#46322) * Don't simply ignore container in present() if image is not specified. * Use image from existing container for recreation if not specified. * Added changelog. * Improve comment. (cherry picked from commit 895019c59b381e405bc31d7cec568c4458f8dfe7) --- ...6322-docker_container-image-not-given.yaml | 2 + .../modules/cloud/docker/docker_container.py | 61 +++++++++++-------- 2 files changed, 37 insertions(+), 26 deletions(-) create mode 100644 changelogs/fragments/46322-docker_container-image-not-given.yaml diff --git a/changelogs/fragments/46322-docker_container-image-not-given.yaml b/changelogs/fragments/46322-docker_container-image-not-given.yaml new file mode 100644 index 00000000000..844a76f1ac6 --- /dev/null +++ b/changelogs/fragments/46322-docker_container-image-not-given.yaml @@ -0,0 +1,2 @@ +bugfixes: +- "docker_container - the behavior is improved in case ``image`` is not specified, but needed for (re-)creating the container." diff --git a/lib/ansible/modules/cloud/docker/docker_container.py b/lib/ansible/modules/cloud/docker/docker_container.py index 34cc8d4c080..082e2b58be1 100644 --- a/lib/ansible/modules/cloud/docker/docker_container.py +++ b/lib/ansible/modules/cloud/docker/docker_container.py @@ -1791,34 +1791,43 @@ class ContainerManager(DockerBaseClass): container = self._get_container(self.parameters.name) # If the image parameter was passed then we need to deal with the image - # version comparison, otherwise we should not care - if self.parameters.image: - image = self._get_image() - self.log(image, pretty_print=True) - if not container.exists: - # New container - self.log('No container found') - new_container = self.container_create(self.parameters.image, self.parameters.create_parameters) + # version comparison. Otherwise we handle this depending on whether + # the container already runs or not; in the former case, in case the + # container needs to be restarted, we use the existing container's + # image ID. + image = self._get_image() + self.log(image, pretty_print=True) + if not container.exists: + # New container + self.log('No container found') + if not self.parameters.image: + self.fail('Cannot create container when image is not specified!') + new_container = self.container_create(self.parameters.image, self.parameters.create_parameters) + if new_container: + container = new_container + else: + # Existing container + different, differences = container.has_different_configuration(image) + image_different = False + if self.parameters.comparisons['image']['comparison'] == 'strict': + image_different = self._image_is_different(image, container) + if image_different or different or self.parameters.recreate: + self.diff['differences'] = differences + if image_different: + self.diff['image_different'] = True + self.log("differences") + self.log(differences, pretty_print=True) + image_to_use = self.parameters.image + if not image_to_use and container and container.Image: + image_to_use = container.Image + if not image_to_use: + self.fail('Cannot recreate container when image is not specified or cannot be extracted from current container!') + if container.running: + self.container_stop(container.Id) + self.container_remove(container.Id) + new_container = self.container_create(image_to_use, self.parameters.create_parameters) if new_container: container = new_container - else: - # Existing container - different, differences = container.has_different_configuration(image) - image_different = False - if not self.parameters.ignore_image: - image_different = self._image_is_different(image, container) - if image_different or different or self.parameters.recreate: - self.diff['differences'] = differences - if image_different: - self.diff['image_different'] = True - self.log("differences") - self.log(differences, pretty_print=True) - if container.running: - self.container_stop(container.Id) - self.container_remove(container.Id) - new_container = self.container_create(self.parameters.image, self.parameters.create_parameters) - if new_container: - container = new_container if container and container.exists: container = self.update_limits(container)