From 41eafc2051d95ac712d1e359920f03056ca523a3 Mon Sep 17 00:00:00 2001 From: Felix Fontein Date: Fri, 4 Oct 2019 21:50:09 +0200 Subject: [PATCH] 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. --- .../62971-docker_container-image-finding.yml | 2 ++ .../modules/cloud/docker/docker_container.py | 10 +++++-- .../tasks/tests/image-ids.yml | 28 ++++++++++++++++++- 3 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 changelogs/fragments/62971-docker_container-image-finding.yml diff --git a/changelogs/fragments/62971-docker_container-image-finding.yml b/changelogs/fragments/62971-docker_container-image-finding.yml new file mode 100644 index 00000000000..cc998580117 --- /dev/null +++ b/changelogs/fragments/62971-docker_container-image-finding.yml @@ -0,0 +1,2 @@ +bugfixes: +- "docker_container - make sure that when image is missing, check mode indicates a change (image will be pulled)." diff --git a/lib/ansible/modules/cloud/docker/docker_container.py b/lib/ansible/modules/cloud/docker/docker_container.py index ce19d9329f9..9a9775348c9 100644 --- a/lib/ansible/modules/cloud/docker/docker_container.py +++ b/lib/ansible/modules/cloud/docker/docker_container.py @@ -2640,8 +2640,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: @@ -2649,6 +2649,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 diff --git a/test/integration/targets/docker_container/tasks/tests/image-ids.yml b/test/integration/targets/docker_container/tasks/tests/image-ids.yml index 376e7acfd7a..f20f2998a3d 100644 --- a/test/integration/targets/docker_container/tasks/tests/image-ids.yml +++ b/test/integration/targets/docker_container/tasks/tests/image-ids.yml @@ -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: