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.
This commit is contained in:
parent
25dfa78dc2
commit
895019c59b
2 changed files with 37 additions and 26 deletions
|
@ -0,0 +1,2 @@
|
|||
bugfixes:
|
||||
- "docker_container - the behavior is improved in case ``image`` is not specified, but needed for (re-)creating the container."
|
|
@ -1912,34 +1912,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 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)
|
||||
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)
|
||||
|
|
Loading…
Reference in a new issue