Skip to content

Commit db52bd0

Browse files
Put a much bigger MaxAliasesForCollections to prevent failing on big compose files relying heavily on aliases
1 parent 55aa264 commit db52bd0

File tree

2 files changed

+39
-1
lines changed

2 files changed

+39
-1
lines changed

core/src/main/java/org/testcontainers/containers/ParsedDockerComposeFile.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,12 @@
77
import lombok.extern.slf4j.Slf4j;
88
import org.apache.commons.io.FileUtils;
99
import org.testcontainers.images.ParsedDockerfile;
10+
import org.yaml.snakeyaml.DumperOptions;
1011
import org.yaml.snakeyaml.LoaderOptions;
1112
import org.yaml.snakeyaml.Yaml;
1213
import org.yaml.snakeyaml.constructor.SafeConstructor;
14+
import org.yaml.snakeyaml.representer.Representer;
15+
import org.yaml.snakeyaml.resolver.Resolver;
1316

1417
import java.io.File;
1518
import java.io.FileInputStream;
@@ -37,7 +40,17 @@ class ParsedDockerComposeFile {
3740
private final Map<String, Set<String>> serviceNameToImageNames = new HashMap<>();
3841

3942
ParsedDockerComposeFile(File composeFile) {
40-
Yaml yaml = new Yaml(new SafeConstructor(new LoaderOptions()));
43+
// The default is 50 and a big docker-compose.yml file can easily go above that number. 1,000 should give us some room
44+
LoaderOptions options = new LoaderOptions();
45+
options.setMaxAliasesForCollections(1_000);
46+
DumperOptions dumperOptions = new DumperOptions();
47+
Yaml yaml = new Yaml(
48+
new SafeConstructor(options),
49+
new Representer(dumperOptions),
50+
dumperOptions,
51+
options,
52+
new Resolver()
53+
);
4154
try (FileInputStream fileInputStream = FileUtils.openInputStream(composeFile)) {
4255
composeFileContent = yaml.load(fileInputStream);
4356
} catch (Exception e) {

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

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,24 @@
33
import com.google.common.collect.ImmutableMap;
44
import com.google.common.collect.Sets;
55
import lombok.SneakyThrows;
6+
import org.junit.Rule;
67
import org.junit.Test;
8+
import org.junit.rules.TemporaryFolder;
79

810
import java.io.File;
11+
import java.io.PrintWriter;
912
import java.util.Collections;
1013

1114
import static org.assertj.core.api.Assertions.assertThat;
15+
import static org.assertj.core.api.Assertions.assertThatNoException;
1216
import static org.assertj.core.api.Assertions.assertThatThrownBy;
1317
import static org.assertj.core.api.Assertions.entry;
1418

1519
public class ParsedDockerComposeFileValidationTest {
1620

21+
@Rule
22+
public TemporaryFolder temporaryFolder = new TemporaryFolder();
23+
1724
@Test
1825
public void shouldValidate() {
1926
File file = new File("src/test/resources/docker-compose-container-name-v1.yml");
@@ -129,4 +136,22 @@ public void shouldObtainImageFromDockerfileBuildWithContext() {
129136
entry("custom", Sets.newHashSet("alpine:3.17"))
130137
); // redis, mysql from compose file, alpine:3.17 from Dockerfile build
131138
}
139+
140+
@Test
141+
public void shouldSupportALotOfAliases() throws Exception {
142+
File file = temporaryFolder.newFile();
143+
try (PrintWriter writer = new PrintWriter(file)) {
144+
writer.println("x-entry: &entry");
145+
writer.println(" key: value");
146+
writer.println();
147+
writer.println("services:");
148+
for (int i = 0; i < 1_000; i++) {
149+
writer.println(" service" + i + ":");
150+
writer.println(" image: busybox");
151+
writer.println(" environment:");
152+
writer.println(" <<: *entry");
153+
}
154+
}
155+
assertThatNoException().isThrownBy(() -> new ParsedDockerComposeFile(file));
156+
}
132157
}

0 commit comments

Comments
 (0)