diff --git a/changelogs/fragments/community.docker-53-docker_image-tag-push.yml b/changelogs/fragments/community.docker-53-docker_image-tag-push.yml new file mode 100644 index 00000000000000..30254673b9ace9 --- /dev/null +++ b/changelogs/fragments/community.docker-53-docker_image-tag-push.yml @@ -0,0 +1,2 @@ +bugfixes: +- "docker_image - if ``push=true`` is used with ``repository``, and the image does not need to be tagged, still push. This can happen if ``repository`` and ``name`` are equal (https://github.com/ansible-collections/community.docker/issues/52, https://github.com/ansible-collections/community.docker/pull/53)." diff --git a/lib/ansible/modules/cloud/docker/docker_image.py b/lib/ansible/modules/cloud/docker/docker_image.py index 363a66505fd659..0599ae509c940b 100644 --- a/lib/ansible/modules/cloud/docker/docker_image.py +++ b/lib/ansible/modules/cloud/docker/docker_image.py @@ -715,8 +715,8 @@ def tag_image(self, name, tag, repository, push=False): if image and image['Id'] == self.results['image']['Id']: self.results['changed'] = False - if push: - self.push_image(repo, repo_tag) + if push: + self.push_image(repo, repo_tag) def build_image(self): ''' diff --git a/test/integration/targets/docker-registry/tasks/tests/docker_image.yml b/test/integration/targets/docker-registry/tasks/tests/docker_image.yml index 58b319517d2b26..1e8ea9d42c027a 100644 --- a/test/integration/targets/docker-registry/tasks/tests/docker_image.yml +++ b/test/integration/targets/docker-registry/tasks/tests/docker_image.yml @@ -10,7 +10,7 @@ - name: Registering image name set_fact: - inames: "{{ inames + [iname, test_image_base ~ ':latest', hello_world_image_base ~ ':latest'] }}" + inames: "{{ inames + [iname, test_image_base ~ ':latest', hello_world_image_base ~ ':latest', hello_world_image_base ~ ':newtag', hello_world_image_base ~ ':newtag2'] }}" #################################################################### ## interact with test registry ##################################### @@ -101,6 +101,82 @@ - facts_2.images | length == 0 - facts_3.images | length == 1 +- name: Tag different image with new tag + docker_image: + name: quay.io/ansible/docker-test-containers:alpine3.8 + repository: "{{ hello_world_image_base }}:newtag" + push: no + source: pull + +- name: Push different image with new tag + docker_image: + name: "{{ hello_world_image_base }}" + repository: "{{ hello_world_image_base }}" + tag: newtag + push: yes + source: local + register: push_1_different + +- name: Push different image with new tag (idempotent) + docker_image: + name: "{{ hello_world_image_base }}" + repository: "{{ hello_world_image_base }}" + tag: newtag + push: yes + source: local + register: push_2_different + +- assert: + that: + - push_1_different is changed + - push_2_different is not changed + +- name: Tag same image with new tag + docker_image: + name: quay.io/ansible/docker-test-containers:alpine3.8 + repository: "{{ hello_world_image_base }}:newtag2" + push: no + source: pull + +- name: Push same image with new tag + docker_image: + name: "{{ hello_world_image_base }}" + repository: "{{ hello_world_image_base }}" + tag: newtag2 + push: yes + source: local + register: push_1_same + +- name: Push same image with new tag (idempotent) + docker_image: + name: "{{ hello_world_image_base }}" + repository: "{{ hello_world_image_base }}" + tag: newtag2 + push: yes + source: local + register: push_2_same + +- assert: + that: + # NOTE: This should be: + # - push_1_same is changed + # Unfortunately docker does *NOT* report whether the tag already existed or not. + # Here are the logs returned by client.push() for both tasks (which are exactly the same): + # push_1_same: + # {"status": "The push refers to repository [localhost:32796/test/hello-world]"}, + # {"id": "3fc64803ca2d", "progressDetail": {}, "status": "Preparing"}, + # {"id": "3fc64803ca2d", "progressDetail": {}, "status": "Layer already exists"}, + # {"status": "newtag2: digest: sha256:92251458088c638061cda8fd8b403b76d661a4dc6b7ee71b6affcf1872557b2b size: 528"}, + # {"aux": {"Digest": "sha256:92251458088c638061cda8fd8b403b76d661a4dc6b7ee71b6affcf1872557b2b", "Size": 528, "Tag": "newtag2"}, "progressDetail": {}} + # push_2_same: + # {"status": "The push refers to repository [localhost:32796/test/hello-world]"}, + # {"id": "3fc64803ca2d", "progressDetail": {}, "status": "Preparing"}, + # {"id": "3fc64803ca2d", "progressDetail": {}, "status": "Layer already exists"}, + # {"status": "newtag2: digest: sha256:92251458088c638061cda8fd8b403b76d661a4dc6b7ee71b6affcf1872557b2b size: 528"}, + # {"aux": {"Digest": "sha256:92251458088c638061cda8fd8b403b76d661a4dc6b7ee71b6affcf1872557b2b", "Size": 528, "Tag": "newtag2"}, "progressDetail": {}} + - push_1_same is not changed + - push_2_same is not changed + #################################################################### ## repository ###################################################### ####################################################################