From 8ecbd9a5cced855e2bd37b2bf1005b75242fba22 Mon Sep 17 00:00:00 2001 From: Felix Fontein Date: Sat, 7 Jun 2025 23:28:51 +0200 Subject: [PATCH] docker_compose_v2: work around bug in `docker compose images --format json` (#1083) * Work around ubg in docker compose images --format json. * ContainerName is no longer in image record. --- changelogs/fragments/1083-docker_compose_v2-images.yml | 4 ++++ plugins/module_utils/compose_v2.py | 5 +++++ .../targets/docker_compose_v2/tasks/tests/build.yml | 4 +++- .../targets/docker_compose_v2/tasks/tests/container-exit.yml | 4 +++- .../targets/docker_compose_v2/tasks/tests/definition.yml | 4 +++- .../targets/docker_compose_v2/tasks/tests/start-stop.yml | 4 +++- 6 files changed, 21 insertions(+), 4 deletions(-) create mode 100644 changelogs/fragments/1083-docker_compose_v2-images.yml diff --git a/changelogs/fragments/1083-docker_compose_v2-images.yml b/changelogs/fragments/1083-docker_compose_v2-images.yml new file mode 100644 index 00000000..880f1143 --- /dev/null +++ b/changelogs/fragments/1083-docker_compose_v2-images.yml @@ -0,0 +1,4 @@ +bugfixes: + - "docker_compose_v2 - handle a (potentially unintentional) breaking change in Docker Compose 2.37.0. + Note that ``ContainerName`` is no longer part of the return value + (https://github.com/ansible-collections/community.docker/issues/1082, https://github.com/ansible-collections/community.docker/pull/1083)." \ No newline at end of file diff --git a/plugins/module_utils/compose_v2.py b/plugins/module_utils/compose_v2.py index eeece9d1..33975fd1 100644 --- a/plugins/module_utils/compose_v2.py +++ b/plugins/module_utils/compose_v2.py @@ -818,6 +818,11 @@ class BaseComposeManager(DockerBaseClass): rc, images, stderr = self.client.call_cli_json(*args, **kwargs) if self.use_json_events and rc != 0: self._handle_failed_cli_call(args, rc, images, stderr) + if isinstance(images, dict): + # Handle breaking change in Docker Compose 2.37.0; see + # https://github.com/ansible-collections/community.docker/issues/1082 + # and https://github.com/docker/compose/issues/12916 for details + images = list(images.values()) return images def parse_events(self, stderr, dry_run=False, nonzero_rc=False): diff --git a/tests/integration/targets/docker_compose_v2/tasks/tests/build.yml b/tests/integration/targets/docker_compose_v2/tasks/tests/build.yml index 827ae38b..a7da381d 100644 --- a/tests/integration/targets/docker_compose_v2/tasks/tests/build.yml +++ b/tests/integration/targets/docker_compose_v2/tasks/tests/build.yml @@ -111,7 +111,9 @@ - present_1.containers | length == 1 - present_1.containers[0].Name == (pname ~ '-' ~ cname ~ '-1') - present_1.images | length == 1 - - present_1.images[0].ContainerName == (pname ~ '-' ~ cname ~ '-1') + - >- + docker_compose_version is version('2.37.0', '==') or + present_1.images[0].ContainerName == (pname ~ '-' ~ cname ~ '-1') - present_1.images[0].Repository == iname - present_1.images[0].Tag == "latest" - present_1.warnings | default([]) | select('regex', ' Please report this at ') | length == 0 diff --git a/tests/integration/targets/docker_compose_v2/tasks/tests/container-exit.yml b/tests/integration/targets/docker_compose_v2/tasks/tests/container-exit.yml index 53f90e33..e1399e32 100644 --- a/tests/integration/targets/docker_compose_v2/tasks/tests/container-exit.yml +++ b/tests/integration/targets/docker_compose_v2/tasks/tests/container-exit.yml @@ -62,7 +62,9 @@ - present_1.containers[0].State == 'exited' - present_1.containers[0].ExitCode == 0 - present_1.images | length == 1 - - present_1.images[0].ContainerName == (pname ~ '-' ~ cname ~ '-1') + - >- + docker_compose_version is version('2.37.0', '==') or + present_1.images[0].ContainerName == (pname ~ '-' ~ cname ~ '-1') - present_1.images[0].Repository == (docker_test_image_alpine | split(':') | first) - present_1.images[0].Tag == (docker_test_image_alpine | split(':') | last) - present_1.warnings | default([]) | select('regex', ' Please report this at ') | length == 0 diff --git a/tests/integration/targets/docker_compose_v2/tasks/tests/definition.yml b/tests/integration/targets/docker_compose_v2/tasks/tests/definition.yml index 5c6cad0c..c3e07bb2 100644 --- a/tests/integration/targets/docker_compose_v2/tasks/tests/definition.yml +++ b/tests/integration/targets/docker_compose_v2/tasks/tests/definition.yml @@ -83,7 +83,9 @@ - present_1.containers[0].Name == (pname ~ '-' ~ cname ~ '-1') - present_1.containers[0].Image == docker_test_image_alpine - present_1.images | length == 1 - - present_1.images[0].ContainerName == (pname ~ '-' ~ cname ~ '-1') + - >- + docker_compose_version is version('2.37.0', '==') or + present_1.images[0].ContainerName == (pname ~ '-' ~ cname ~ '-1') - present_1.images[0].Repository == (docker_test_image_alpine | split(':') | first) - present_1.images[0].Tag == (docker_test_image_alpine | split(':') | last) - present_1.warnings | default([]) | select('regex', ' Please report this at ') | length == 0 diff --git a/tests/integration/targets/docker_compose_v2/tasks/tests/start-stop.yml b/tests/integration/targets/docker_compose_v2/tasks/tests/start-stop.yml index 639a0250..736f6902 100644 --- a/tests/integration/targets/docker_compose_v2/tasks/tests/start-stop.yml +++ b/tests/integration/targets/docker_compose_v2/tasks/tests/start-stop.yml @@ -100,7 +100,9 @@ - present_1.containers[0].Name == (pname ~ '-' ~ cname ~ '-1') - present_1.containers[0].Image == docker_test_image_alpine - present_1.images | length == 1 - - present_1.images[0].ContainerName == (pname ~ '-' ~ cname ~ '-1') + - >- + docker_compose_version is version('2.37.0', '==') or + present_1.images[0].ContainerName == (pname ~ '-' ~ cname ~ '-1') - present_1.images[0].Repository == (docker_test_image_alpine | split(':') | first) - present_1.images[0].Tag == (docker_test_image_alpine | split(':') | last) - present_1.warnings | default([]) | select('regex', ' Please report this at ') | length == 0