diff --git a/core/src/main/java/org/testcontainers/images/builder/ImageFromDockerfile.java b/core/src/main/java/org/testcontainers/images/builder/ImageFromDockerfile.java index 201cf0fd058..2daed45b3fb 100644 --- a/core/src/main/java/org/testcontainers/images/builder/ImageFromDockerfile.java +++ b/core/src/main/java/org/testcontainers/images/builder/ImageFromDockerfile.java @@ -60,6 +60,8 @@ public class ImageFromDockerfile private Optional dockerfile = Optional.empty(); + private Optional target = Optional.empty(); + private Set dependencyImageNames = Collections.emptySet(); public ImageFromDockerfile() { @@ -177,6 +179,7 @@ protected void configure(BuildImageCmd buildImageCmd) { }); this.buildArgs.forEach(buildImageCmd::withBuildArg); + this.target.ifPresent(buildImageCmd::withTarget); } private void prePullDependencyImages(Set imagesToPull) { @@ -211,6 +214,16 @@ public ImageFromDockerfile withBuildArgs(final Map args) { return this; } + /** + * Sets the target build stage to use. + * + * @param target the target build stage + */ + public ImageFromDockerfile withTarget(String target) { + this.target = Optional.of(target); + return this; + } + /** * Sets the Dockerfile to be used for this image. * diff --git a/core/src/test/java/org/testcontainers/containers/MultiStageBuildTest.java b/core/src/test/java/org/testcontainers/containers/MultiStageBuildTest.java new file mode 100644 index 00000000000..80ae37a0a07 --- /dev/null +++ b/core/src/test/java/org/testcontainers/containers/MultiStageBuildTest.java @@ -0,0 +1,28 @@ +package org.testcontainers.containers; + +import org.junit.Test; +import org.testcontainers.images.builder.ImageFromDockerfile; + +import java.io.IOException; +import java.nio.file.Paths; + +import static org.assertj.core.api.Assertions.assertThat; + +public class MultiStageBuildTest { + + @Test + public void testDockerMultistageBuild() throws IOException, InterruptedException { + try ( + GenericContainer container = new GenericContainer<>( + new ImageFromDockerfile() + .withDockerfile(Paths.get("src/test/resources/Dockerfile-multistage")) + .withTarget("builder") + ) + .withCommand("/bin/sh", "-c", "sleep 10") + ) { + container.start(); + assertThat(container.execInContainer("pwd").getStdout()).contains("/my-files"); + assertThat(container.execInContainer("ls").getStdout()).contains("hello.txt"); + } + } +} diff --git a/core/src/test/resources/Dockerfile-multistage b/core/src/test/resources/Dockerfile-multistage new file mode 100644 index 00000000000..363b02b22ea --- /dev/null +++ b/core/src/test/resources/Dockerfile-multistage @@ -0,0 +1,9 @@ +FROM alpine:3.14 AS builder + +WORKDIR /my-files + +RUN echo 'Hello World' > hello.txt + +FROM alpine:3.14 + +COPY --from=builder /my-files/hello.txt hello.txt