From 5ef773191f5d75e76fba9d7d2cad74b933819689 Mon Sep 17 00:00:00 2001 From: Jeff Shaw Date: Tue, 18 Jul 2023 15:05:43 -0400 Subject: [PATCH 1/2] Add the ability to specify an image's platform. It's possible to specify the platform for a container by using `GenericContainer#withCreateContainerCmdModifier`. However, it's not possible to do the same when creating an image, and so it's not possible to both create and test an image for a platform. This adds `ImageFromDockerfile#withBuildImageCmdModifier` which makes this possible. --- .../images/builder/ImageFromDockerfile.java | 17 +++++++++++++++++ 1 file changed, 17 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 2daed45b3fb..c74721b6ebb 100644 --- a/core/src/main/java/org/testcontainers/images/builder/ImageFromDockerfile.java +++ b/core/src/main/java/org/testcontainers/images/builder/ImageFromDockerfile.java @@ -4,6 +4,8 @@ import com.github.dockerjava.api.command.BuildImageCmd; import com.github.dockerjava.api.command.BuildImageResultCallback; import com.github.dockerjava.api.model.BuildResponseItem; +import java.util.LinkedHashSet; +import java.util.function.Consumer; import lombok.Cleanup; import lombok.Getter; import lombok.extern.slf4j.Slf4j; @@ -62,6 +64,8 @@ public class ImageFromDockerfile private Optional target = Optional.empty(); + private final Set> buildImageCmdModifiers = new LinkedHashSet<>(); + private Set dependencyImageNames = Collections.emptySet(); public ImageFromDockerfile() { @@ -180,6 +184,7 @@ protected void configure(BuildImageCmd buildImageCmd) { this.buildArgs.forEach(buildImageCmd::withBuildArg); this.target.ifPresent(buildImageCmd::withTarget); + this.buildImageCmdModifiers.forEach(hook -> hook.accept(buildImageCmd)); } private void prePullDependencyImages(Set imagesToPull) { @@ -248,4 +253,16 @@ public ImageFromDockerfile withDockerfile(Path dockerfile) { this.dockerfile = Optional.of(dockerfile); return this; } + + /** + * Allow low level modifications of {@link BuildImageCmd}. + * Warning: this does expose the underlying docker-java API so might change outside of our control. + * + * @param modifier {@link Consumer} of {@link BuildImageCmd}. + * @return this + */ + public ImageFromDockerfile withBuildImageCmdModifier(Consumer modifier) { + this.buildImageCmdModifiers.add(modifier); + return this; + } } From 7a31d739b24ffde29cba98c622add3a1c7d11e63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Wed, 29 Nov 2023 11:37:15 -0600 Subject: [PATCH 2/2] Add test --- .../images/builder/ImageFromDockerfile.java | 4 ++-- .../containers/MultiStageBuildTest.java | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 2 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 c74721b6ebb..b35ef830c11 100644 --- a/core/src/main/java/org/testcontainers/images/builder/ImageFromDockerfile.java +++ b/core/src/main/java/org/testcontainers/images/builder/ImageFromDockerfile.java @@ -4,8 +4,6 @@ import com.github.dockerjava.api.command.BuildImageCmd; import com.github.dockerjava.api.command.BuildImageResultCallback; import com.github.dockerjava.api.model.BuildResponseItem; -import java.util.LinkedHashSet; -import java.util.function.Consumer; import lombok.Cleanup; import lombok.Getter; import lombok.extern.slf4j.Slf4j; @@ -34,9 +32,11 @@ import java.nio.file.Path; import java.util.Collections; import java.util.HashMap; +import java.util.LinkedHashSet; import java.util.Map; import java.util.Optional; import java.util.Set; +import java.util.function.Consumer; import java.util.zip.GZIPOutputStream; @Slf4j diff --git a/core/src/test/java/org/testcontainers/containers/MultiStageBuildTest.java b/core/src/test/java/org/testcontainers/containers/MultiStageBuildTest.java index 80ae37a0a07..f5bed1020c0 100644 --- a/core/src/test/java/org/testcontainers/containers/MultiStageBuildTest.java +++ b/core/src/test/java/org/testcontainers/containers/MultiStageBuildTest.java @@ -25,4 +25,20 @@ public void testDockerMultistageBuild() throws IOException, InterruptedException assertThat(container.execInContainer("ls").getStdout()).contains("hello.txt"); } } + + @Test + public void shouldBuildMultistageBuildWithBuildImageCmdModifier() throws IOException, InterruptedException { + try ( + GenericContainer container = new GenericContainer<>( + new ImageFromDockerfile() + .withDockerfile(Paths.get("src/test/resources/Dockerfile-multistage")) + .withBuildImageCmdModifier(cmd -> cmd.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"); + } + } }