docker_container: improve image finding / change detection (#62971)

* Improve image finding / change detection.

* Checked wrong object.

* Improve behavior. (Let docker daemon sort this out.)

* Add changelog.

* Add simple test.

* Fix image name.

* Use new docker_image params.

* Rewrite.

(cherry picked from commit 41eafc2051)
This commit is contained in:
Felix Fontein 2019-10-04 21:50:09 +02:00 committed by Toshio Kuratomi
parent 9fd70e3f3c
commit 9e211c64ce
3 changed files with 37 additions and 3 deletions

View file

@ -0,0 +1,2 @@
bugfixes:
- "docker_container - make sure that when image is missing, check mode indicates a change (image will be pulled)."

View file

@ -2669,8 +2669,8 @@ class ContainerManager(DockerBaseClass):
if not tag:
tag = "latest"
image = self.client.find_image(repository, tag)
if not self.check_mode:
if not image or self.parameters.pull:
if not image or self.parameters.pull:
if not self.check_mode:
self.log("Pull the image.")
image, alreadyToLatest = self.client.pull_image(repository, tag)
if alreadyToLatest:
@ -2678,6 +2678,12 @@ class ContainerManager(DockerBaseClass):
else:
self.results['changed'] = True
self.results['actions'].append(dict(pulled_image="%s:%s" % (repository, tag)))
elif not image:
# If the image isn't there, claim we'll pull.
# (Implicitly: if the image is there, claim it already was latest.)
self.results['changed'] = True
self.results['actions'].append(dict(pulled_image="%s:%s" % (repository, tag)))
self.log("image")
self.log(image, pretty_print=True)
return image

View file

@ -9,7 +9,7 @@
- name: Pull images
docker_image:
name: "{{ image }}"
pull: true
source: pull
loop:
- "hello-world:latest"
- "alpine:3.8"
@ -63,6 +63,28 @@
force_kill: yes
register: create_4
- name: Untag image
# Image will not be deleted since the container still uses it
docker_image:
name: alpine:3.8
force_absent: yes
state: absent
- name: Create container with alpine image via name (check mode, will pull, same image)
docker_container:
image: alpine:3.8
name: "{{ cname }}"
state: present
register: create_5
check_mode: yes
- name: Create container with alpine image via name (will pull, same image)
docker_container:
image: alpine:3.8
name: "{{ cname }}"
state: present
register: create_6
- name: Cleanup
docker_container:
name: "{{ cname }}"
@ -76,6 +98,10 @@
- create_2 is not changed
- create_3 is changed
- create_4 is not changed
- create_5 is changed
- create_6 is changed
- create_6.container.Image == image_info.images[1].Id
- create_6.container.Id == create_4.container.Id # make sure container wasn't recreated
- name: set Digests
set_fact: