From dda320637ce4bcd4777c3097675b32bb41fcfe48 Mon Sep 17 00:00:00 2001 From: GenghisChen Date: Thu, 30 Dec 2021 13:16:22 -0500 Subject: [PATCH 1/3] Adds the ability to set a target build stage --- .../images/builder/ImageFromDockerfile.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) 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 05bb6911c3e..689e21378cf 100644 --- a/core/src/main/java/org/testcontainers/images/builder/ImageFromDockerfile.java +++ b/core/src/main/java/org/testcontainers/images/builder/ImageFromDockerfile.java @@ -51,6 +51,7 @@ public class ImageFromDockerfile extends LazyFuture implements private final Map buildArgs = new HashMap<>(); private Optional dockerFilePath = Optional.empty(); private Optional dockerfile = Optional.empty(); + private Optional target = Optional.empty(); private Set dependencyImageNames = Collections.emptySet(); public ImageFromDockerfile() { @@ -149,6 +150,7 @@ public void onNext(BuildResponseItem item) { protected void configure(BuildImageCmd buildImageCmd) { buildImageCmd.withTag(this.getDockerImageName()); + this.target.ifPresent(buildImageCmd::withTarget); this.dockerFilePath.ifPresent(buildImageCmd::withDockerfilePath); this.dockerfile.ifPresent(p -> { buildImageCmd.withDockerfile(p.toFile()); @@ -187,6 +189,18 @@ public ImageFromDockerfile withBuildArgs(final Map args) { return this; } + /** + * Sets the target build stage as described in Docker's documentation: + * "When you build your image, you don’t necessarily need to build the entire Dockerfile including every stage. + * You can specify a target build stage." + * + * @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. * From 81c0ae2c694b1e7af5b010d811283a89e97a9210 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Thu, 6 Oct 2022 18:06:03 -0500 Subject: [PATCH 2/3] Add multistage build test --- .../images/builder/ImageFromDockerfile.java | 2 +- .../containers/MultiStageBuildTest.java | 28 +++++++++++++++++++ core/src/test/resources/Dockerfile-multistage | 9 ++++++ 3 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 core/src/test/java/org/testcontainers/containers/MultiStageBuildTest.java create mode 100644 core/src/test/resources/Dockerfile-multistage 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 e4efbec8a63..2c77b41350c 100644 --- a/core/src/main/java/org/testcontainers/images/builder/ImageFromDockerfile.java +++ b/core/src/main/java/org/testcontainers/images/builder/ImageFromDockerfile.java @@ -166,7 +166,6 @@ public void onNext(BuildResponseItem item) { protected void configure(BuildImageCmd buildImageCmd) { buildImageCmd.withTag(this.getDockerImageName()); - this.target.ifPresent(buildImageCmd::withTarget); this.dockerFilePath.ifPresent(buildImageCmd::withDockerfilePath); this.dockerfile.ifPresent(p -> { buildImageCmd.withDockerfile(p.toFile()); @@ -180,6 +179,7 @@ protected void configure(BuildImageCmd buildImageCmd) { }); this.buildArgs.forEach(buildImageCmd::withBuildArg); + this.target.ifPresent(buildImageCmd::withTarget); } private void prePullDependencyImages(Set imagesToPull) { 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 From eb12470530479f177c9ca5f1041afe9b1d58b270 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Mon, 7 Nov 2022 19:45:33 -0600 Subject: [PATCH 3/3] Fix javadoc --- .../testcontainers/images/builder/ImageFromDockerfile.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) 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 2c77b41350c..2daed45b3fb 100644 --- a/core/src/main/java/org/testcontainers/images/builder/ImageFromDockerfile.java +++ b/core/src/main/java/org/testcontainers/images/builder/ImageFromDockerfile.java @@ -215,9 +215,7 @@ public ImageFromDockerfile withBuildArgs(final Map args) { } /** - * Sets the target build stage as described in Docker's documentation: - * "When you build your image, you don’t necessarily need to build the entire Dockerfile including every stage. - * You can specify a target build stage." + * Sets the target build stage to use. * * @param target the target build stage */