Skip to content

Commit 49b13d8

Browse files
authored
Support reset value in Docker Compose (#9343)
Fixes #7919
1 parent b2aa062 commit 49b13d8

File tree

4 files changed

+68
-7
lines changed

4 files changed

+68
-7
lines changed

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

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
import org.yaml.snakeyaml.LoaderOptions;
1212
import org.yaml.snakeyaml.Yaml;
1313
import org.yaml.snakeyaml.constructor.SafeConstructor;
14+
import org.yaml.snakeyaml.nodes.Node;
15+
import org.yaml.snakeyaml.nodes.Tag;
1416
import org.yaml.snakeyaml.representer.Representer;
1517
import org.yaml.snakeyaml.resolver.Resolver;
1618

@@ -44,13 +46,17 @@ class ParsedDockerComposeFile {
4446
LoaderOptions options = new LoaderOptions();
4547
options.setMaxAliasesForCollections(1_000);
4648
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-
);
49+
50+
SafeConstructor constructor = new SafeConstructor(options) {
51+
@Override
52+
protected Object constructObject(Node node) {
53+
if (node.getTag().equals(new Tag("!reset"))) {
54+
return null;
55+
}
56+
return super.constructObject(node);
57+
}
58+
};
59+
Yaml yaml = new Yaml(constructor, new Representer(dumperOptions), dumperOptions, options, new Resolver());
5460
try (FileInputStream fileInputStream = FileUtils.openInputStream(composeFile)) {
5561
composeFileContent = yaml.load(fileInputStream);
5662
} catch (Exception e) {
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package org.testcontainers.junit;
2+
3+
import com.github.dockerjava.api.command.InspectContainerResponse;
4+
import org.junit.Test;
5+
import org.testcontainers.containers.ComposeContainer;
6+
import org.testcontainers.containers.ContainerState;
7+
8+
import java.io.File;
9+
10+
import static org.assertj.core.api.Assertions.assertThat;
11+
12+
public class ComposeContainerOverrideTest {
13+
14+
private static final File BASE = new File("src/test/resources/compose-override/compose.yml");
15+
16+
private static final File OVERRIDE = new File("src/test/resources/compose-override/compose-override.yml");
17+
18+
@Test
19+
public void readEnvironment() {
20+
try (ComposeContainer compose = new ComposeContainer(BASE).withExposedService("redis", 6379)) {
21+
compose.start();
22+
InspectContainerResponse container = compose
23+
.getContainerByServiceName("redis-1")
24+
.map(ContainerState::getContainerInfo)
25+
.get();
26+
assertThat(container.getConfig().getEnv()).contains("foo=bar");
27+
}
28+
}
29+
30+
@Test
31+
public void resetEnvironment() {
32+
try (ComposeContainer compose = new ComposeContainer(BASE, OVERRIDE).withExposedService("redis", 6379)) {
33+
compose.start();
34+
InspectContainerResponse container = compose
35+
.getContainerByServiceName("redis-1")
36+
.map(ContainerState::getContainerInfo)
37+
.get();
38+
assertThat(container.getConfig().getEnv()).doesNotContain("foo=bar");
39+
}
40+
}
41+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
services:
2+
redis:
3+
image: redis:6-alpine
4+
ports:
5+
- 6379
6+
environment:
7+
foo: !reset null
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
services:
2+
redis:
3+
image: redis:6-alpine
4+
ports:
5+
- 6379
6+
environment:
7+
foo: bar

0 commit comments

Comments
 (0)