diff options
author | Felix Fontein <felix@fontein.de> | 2019-10-04 21:50:09 +0200 |
---|---|---|
committer | Toshio Kuratomi <a.badger@gmail.com> | 2019-10-12 09:17:09 -0700 |
commit | 6c757c0989e8b05a710ae59bf8285b9a35e8b801 (patch) | |
tree | 1b24c32c5d4e391172cd009e416ed7d377b45850 | |
parent | 076988e8a6aeb02208dfca55872e6c98cc613fa8 (diff) | |
download | ansible-6c757c0989e8b05a710ae59bf8285b9a35e8b801.tar.gz |
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 41eafc2051d95ac712d1e359920f03056ca523a3)
3 files changed, 37 insertions, 3 deletions
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 0000000000..cc99858011 --- /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 a4127be799..6529413bb1 100644 --- a/lib/ansible/modules/cloud/docker/docker_container.py +++ b/lib/ansible/modules/cloud/docker/docker_container.py @@ -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 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 376e7acfd7..f20f2998a3 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: |