summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFelix Fontein <felix@fontein.de>2019-10-04 21:50:09 +0200
committerToshio Kuratomi <a.badger@gmail.com>2019-10-12 09:17:09 -0700
commit6c757c0989e8b05a710ae59bf8285b9a35e8b801 (patch)
tree1b24c32c5d4e391172cd009e416ed7d377b45850
parent076988e8a6aeb02208dfca55872e6c98cc613fa8 (diff)
downloadansible-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)
-rw-r--r--changelogs/fragments/62971-docker_container-image-finding.yml2
-rw-r--r--lib/ansible/modules/cloud/docker/docker_container.py10
-rw-r--r--test/integration/targets/docker_container/tasks/tests/image-ids.yml28
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: