Browse Source

Fallback to finding docker image name from compose ps

Earlier versions of docker do not include the image name in the inspect
output. We now fallback to using the `compose ps` response.

Closes gh-34993
pull/35031/head
Phillip Webb 3 years ago
parent
commit
efff253d35
  1. 9
      spring-boot-project/spring-boot-docker-compose/src/main/java/org/springframework/boot/docker/compose/core/DefaultRunningService.java
  2. 44
      spring-boot-project/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/core/DefaultRunningServiceTests.java

9
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; private DockerEnv env;
DefaultRunningService(DockerHost host, DockerComposeFile composeFile, DockerCliComposePsResponse psResponse, DefaultRunningService(DockerHost host, DockerComposeFile composeFile, DockerCliComposePsResponse composePsResponse,
DockerCliInspectResponse inspectResponse) { DockerCliInspectResponse inspectResponse) {
this.origin = new DockerComposeOrigin(composeFile, psResponse.name()); this.origin = new DockerComposeOrigin(composeFile, composePsResponse.name());
this.name = psResponse.name(); this.name = composePsResponse.name();
this.image = ImageReference.of(psResponse.image()); this.image = ImageReference
.of((composePsResponse.image() != null) ? composePsResponse.image() : inspectResponse.config().image());
this.host = host; this.host = host;
this.ports = new DefaultConnectionPorts(inspectResponse); this.ports = new DefaultConnectionPorts(inspectResponse);
this.env = new DockerEnv(inspectResponse.config().env()); this.env = new DockerEnv(inspectResponse.config().env());

44
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 @BeforeEach
void setup() throws Exception { void setup() throws Exception {
this.composeFile = createComposeFile(); this.composeFile = createComposeFile();
DockerHost host = DockerHost.get("192.168.1.1", () -> Collections.emptyList()); this.runningService = createRunningService(true);
String id = "123";
String name = "my-service";
String image = "redis";
String state = "running";
DockerCliComposePsResponse psResponse = new DockerCliComposePsResponse(id, name, image, state);
Map<String, String> labels = Map.of("spring", "boot");
Map<String, ExposedPort> exposedPorts = Map.of("8080/tcp", new ExposedPort());
List<String> env = List.of("a=b");
Config config = new Config(image, labels, exposedPorts, env);
Map<String, List<HostPort>> 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);
} }
private DockerComposeFile createComposeFile() throws IOException { private DockerComposeFile createComposeFile() throws IOException {
@ -95,6 +80,13 @@ class DefaultRunningServiceTests {
assertThat(this.runningService.image()).hasToString("redis"); assertThat(this.runningService.image()).hasToString("redis");
} }
@Test // gh-34992
void imageWhenUsingEarlierDockerVersionReturnsImageFromInspectResult() {
DefaultRunningService runningService = createRunningService(false);
assertThat(runningService.image()).hasToString("redis");
}
@Test @Test
void hostReturnsHost() { void hostReturnsHost() {
assertThat(this.runningService.host()).isEqualTo("192.168.1.1"); assertThat(this.runningService.host()).isEqualTo("192.168.1.1");
@ -122,4 +114,24 @@ class DefaultRunningServiceTests {
assertThat(this.runningService).hasToString("my-service"); 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<String, String> labels = Map.of("spring", "boot");
Map<String, ExposedPort> exposedPorts = Map.of("8080/tcp", new ExposedPort());
List<String> env = List.of("a=b");
Config config = new Config(image, labels, exposedPorts, env);
Map<String, List<HostPort>> 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);
}
} }

Loading…
Cancel
Save