Skip to content

Commit d44e616

Browse files
authored
Prevent Compose image pre-fetching from pulling all tags when tag is absent (#4538)
1 parent dd93725 commit d44e616

File tree

2 files changed

+14
-14
lines changed

2 files changed

+14
-14
lines changed
Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,43 @@
11
package org.testcontainers.containers;
22

3+
import org.testcontainers.utility.DockerImageName;
4+
35
import java.io.File;
6+
import java.util.Collection;
47
import java.util.HashMap;
5-
import java.util.HashSet;
68
import java.util.List;
79
import java.util.Map;
8-
import java.util.Map.Entry;
910
import java.util.Set;
1011
import java.util.stream.Collectors;
1112

1213
public class DockerComposeFiles {
1314

14-
private List<ParsedDockerComposeFile> parsedComposeFiles;
15+
private final List<ParsedDockerComposeFile> parsedComposeFiles;
1516

1617
public DockerComposeFiles(List<File> composeFiles) {
1718
this.parsedComposeFiles = composeFiles.stream().map(ParsedDockerComposeFile::new).collect(Collectors.toList());
1819
}
1920

2021
public Set<String> getDependencyImages() {
21-
2222
Map<String, Set<String>> mergedServiceNameToImageNames = mergeServiceDependencyImageNames();
2323

2424
return getImageNames(mergedServiceNameToImageNames);
2525
}
2626

2727
private Map<String, Set<String>> mergeServiceDependencyImageNames() {
28-
Map<String, Set<String>> mergedServiceNameToImageNames = new HashMap();
28+
Map<String, Set<String>> mergedServiceNameToImageNames = new HashMap<>();
2929
for (ParsedDockerComposeFile parsedComposeFile : parsedComposeFiles) {
30-
for (Entry<String, Set<String>> entry : parsedComposeFile.getServiceNameToImageNames().entrySet()) {
31-
mergedServiceNameToImageNames.put(entry.getKey(), entry.getValue());
32-
}
30+
mergedServiceNameToImageNames.putAll(parsedComposeFile.getServiceNameToImageNames());
3331
}
3432
return mergedServiceNameToImageNames;
3533
}
3634

3735
private Set<String> getImageNames(Map<String, Set<String>> serviceToImageNames) {
38-
Set<String> imageNames = new HashSet<>();
39-
serviceToImageNames.values().stream().forEach(imageNames::addAll);
40-
return imageNames;
36+
return serviceToImageNames.values().stream()
37+
.flatMap(Collection::stream)
38+
// Pass through DockerImageName to convert image names to canonical form (e.g. making implicit latest tag explicit)
39+
.map(DockerImageName::parse)
40+
.map(DockerImageName::asCanonicalNameString)
41+
.collect(Collectors.toSet());
4142
}
42-
4343
}

core/src/test/java/org/testcontainers/containers/DockerComposeFilesTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ public class DockerComposeFilesTest {
1111
public void shouldGetDependencyImages() {
1212
DockerComposeFiles dockerComposeFiles = new DockerComposeFiles(Lists.newArrayList(new File("src/test/resources/docker-compose-imagename-parsing-v2.yml")));
1313
Assertions.assertThat(dockerComposeFiles.getDependencyImages())
14-
.containsExactlyInAnyOrder("postgres", "redis", "mysql");
14+
.containsExactlyInAnyOrder("postgres:latest", "redis:latest", "mysql:latest");
1515
}
1616

1717
@Test
@@ -20,6 +20,6 @@ public void shouldGetDependencyImagesWhenOverriding() {
2020
Lists.newArrayList(new File("src/test/resources/docker-compose-imagename-overriding-a.yml"),
2121
new File("src/test/resources/docker-compose-imagename-overriding-b.yml")));
2222
Assertions.assertThat(dockerComposeFiles.getDependencyImages())
23-
.containsExactlyInAnyOrder("alpine:3.14", "redis:b", "mysql:b", "aservice");
23+
.containsExactlyInAnyOrder("alpine:3.14", "redis:b", "mysql:b", "aservice:latest");
2424
}
2525
}

0 commit comments

Comments
 (0)