diff --git a/spring-boot-project/spring-boot-docker-compose/src/main/java/org/springframework/boot/docker/compose/core/DefaultRunningService.java b/spring-boot-project/spring-boot-docker-compose/src/main/java/org/springframework/boot/docker/compose/core/DefaultRunningService.java index dc7581d5268..5b6acbefd8d 100644 --- a/spring-boot-project/spring-boot-docker-compose/src/main/java/org/springframework/boot/docker/compose/core/DefaultRunningService.java +++ b/spring-boot-project/spring-boot-docker-compose/src/main/java/org/springframework/boot/docker/compose/core/DefaultRunningService.java @@ -45,11 +45,12 @@ class DefaultRunningService implements RunningService, OriginProvider { private DockerEnv env; - DefaultRunningService(DockerHost host, DockerComposeFile composeFile, DockerCliComposePsResponse psResponse, + DefaultRunningService(DockerHost host, DockerComposeFile composeFile, DockerCliComposePsResponse composePsResponse, DockerCliInspectResponse inspectResponse) { - this.origin = new DockerComposeOrigin(composeFile, psResponse.name()); - this.name = psResponse.name(); - this.image = ImageReference.of(psResponse.image()); + this.origin = new DockerComposeOrigin(composeFile, composePsResponse.name()); + this.name = composePsResponse.name(); + this.image = ImageReference + .of((composePsResponse.image() != null) ? composePsResponse.image() : inspectResponse.config().image()); this.host = host; this.ports = new DefaultConnectionPorts(inspectResponse); this.env = new DockerEnv(inspectResponse.config().env()); diff --git a/spring-boot-project/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/core/DefaultRunningServiceTests.java b/spring-boot-project/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/core/DefaultRunningServiceTests.java index f91bc9f8b63..d334a473f66 100644 --- a/spring-boot-project/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/core/DefaultRunningServiceTests.java +++ b/spring-boot-project/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/core/DefaultRunningServiceTests.java @@ -56,22 +56,7 @@ class DefaultRunningServiceTests { @BeforeEach void setup() throws Exception { this.composeFile = createComposeFile(); - DockerHost host = DockerHost.get("192.168.1.1", () -> Collections.emptyList()); - String id = "123"; - String name = "my-service"; - String image = "redis"; - String state = "running"; - DockerCliComposePsResponse psResponse = new DockerCliComposePsResponse(id, name, image, state); - Map labels = Map.of("spring", "boot"); - Map exposedPorts = Map.of("8080/tcp", new ExposedPort()); - List env = List.of("a=b"); - Config config = new Config(image, labels, exposedPorts, env); - Map> ports = Map.of("8080/tcp", List.of(new HostPort(null, "9090"))); - NetworkSettings networkSettings = new NetworkSettings(ports); - HostConfig hostConfig = new HostConfig("bridge"); - DockerCliInspectResponse inspectResponse = new DockerCliInspectResponse(id, config, networkSettings, - hostConfig); - this.runningService = new DefaultRunningService(host, this.composeFile, psResponse, inspectResponse); + this.runningService = createRunningService(true); } private DockerComposeFile createComposeFile() throws IOException { @@ -95,6 +80,13 @@ class DefaultRunningServiceTests { assertThat(this.runningService.image()).hasToString("redis"); } + @Test // gh-34992 + void imageWhenUsingEarlierDockerVersionReturnsImageFromInspectResult() { + DefaultRunningService runningService = createRunningService(false); + assertThat(runningService.image()).hasToString("redis"); + + } + @Test void hostReturnsHost() { assertThat(this.runningService.host()).isEqualTo("192.168.1.1"); @@ -122,4 +114,24 @@ class DefaultRunningServiceTests { assertThat(this.runningService).hasToString("my-service"); } + private DefaultRunningService createRunningService(boolean psResponseHasImage) { + DockerHost host = DockerHost.get("192.168.1.1", () -> Collections.emptyList()); + String id = "123"; + String name = "my-service"; + String image = "redis"; + String state = "running"; + DockerCliComposePsResponse psResponse = new DockerCliComposePsResponse(id, name, + (!psResponseHasImage) ? null : image, state); + Map labels = Map.of("spring", "boot"); + Map exposedPorts = Map.of("8080/tcp", new ExposedPort()); + List env = List.of("a=b"); + Config config = new Config(image, labels, exposedPorts, env); + Map> ports = Map.of("8080/tcp", List.of(new HostPort(null, "9090"))); + NetworkSettings networkSettings = new NetworkSettings(ports); + HostConfig hostConfig = new HostConfig("bridge"); + DockerCliInspectResponse inspectResponse = new DockerCliInspectResponse(id, config, networkSettings, + hostConfig); + return new DefaultRunningService(host, this.composeFile, psResponse, inspectResponse); + } + }