Skip to content

Commit d5dc4d3

Browse files
Add support to ImageFromDockerfile (#7313)
`withBuildImageCmdModifier` allows to customize the `BuildImageCmd` created with `ImageFromDockerfile`. --------- Co-authored-by: Eddú Meléndez <[email protected]>
1 parent 62e6062 commit d5dc4d3

File tree

2 files changed

+33
-0
lines changed

2 files changed

+33
-0
lines changed

core/src/main/java/org/testcontainers/images/builder/ImageFromDockerfile.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,11 @@
3232
import java.nio.file.Path;
3333
import java.util.Collections;
3434
import java.util.HashMap;
35+
import java.util.LinkedHashSet;
3536
import java.util.Map;
3637
import java.util.Optional;
3738
import java.util.Set;
39+
import java.util.function.Consumer;
3840
import java.util.zip.GZIPOutputStream;
3941

4042
@Slf4j
@@ -62,6 +64,8 @@ public class ImageFromDockerfile
6264

6365
private Optional<String> target = Optional.empty();
6466

67+
private final Set<Consumer<BuildImageCmd>> buildImageCmdModifiers = new LinkedHashSet<>();
68+
6569
private Set<String> dependencyImageNames = Collections.emptySet();
6670

6771
public ImageFromDockerfile() {
@@ -180,6 +184,7 @@ protected void configure(BuildImageCmd buildImageCmd) {
180184

181185
this.buildArgs.forEach(buildImageCmd::withBuildArg);
182186
this.target.ifPresent(buildImageCmd::withTarget);
187+
this.buildImageCmdModifiers.forEach(hook -> hook.accept(buildImageCmd));
183188
}
184189

185190
private void prePullDependencyImages(Set<String> imagesToPull) {
@@ -248,4 +253,16 @@ public ImageFromDockerfile withDockerfile(Path dockerfile) {
248253
this.dockerfile = Optional.of(dockerfile);
249254
return this;
250255
}
256+
257+
/**
258+
* Allow low level modifications of {@link BuildImageCmd}.
259+
* Warning: this does expose the underlying docker-java API so might change outside of our control.
260+
*
261+
* @param modifier {@link Consumer} of {@link BuildImageCmd}.
262+
* @return this
263+
*/
264+
public ImageFromDockerfile withBuildImageCmdModifier(Consumer<BuildImageCmd> modifier) {
265+
this.buildImageCmdModifiers.add(modifier);
266+
return this;
267+
}
251268
}

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,20 @@ public void testDockerMultistageBuild() throws IOException, InterruptedException
2525
assertThat(container.execInContainer("ls").getStdout()).contains("hello.txt");
2626
}
2727
}
28+
29+
@Test
30+
public void shouldBuildMultistageBuildWithBuildImageCmdModifier() throws IOException, InterruptedException {
31+
try (
32+
GenericContainer<?> container = new GenericContainer<>(
33+
new ImageFromDockerfile()
34+
.withDockerfile(Paths.get("src/test/resources/Dockerfile-multistage"))
35+
.withBuildImageCmdModifier(cmd -> cmd.withTarget("builder"))
36+
)
37+
.withCommand("/bin/sh", "-c", "sleep 10")
38+
) {
39+
container.start();
40+
assertThat(container.execInContainer("pwd").getStdout()).contains("/my-files");
41+
assertThat(container.execInContainer("ls").getStdout()).contains("hello.txt");
42+
}
43+
}
2844
}

0 commit comments

Comments
 (0)