diff --git a/testcontainers-advanced-imagebuilder/pom.xml b/testcontainers-advanced-imagebuilder/pom.xml
index 40842f2..91d242c 100644
--- a/testcontainers-advanced-imagebuilder/pom.xml
+++ b/testcontainers-advanced-imagebuilder/pom.xml
@@ -6,7 +6,7 @@
software.xdev
testcontainers-advanced-imagebuilder
- 4.0.1-SNAPSHOT
+ 4.1.0-SNAPSHOT
jar
testcontainers-advanced-imagebuilder
diff --git a/testcontainers-advanced-imagebuilder/src/main/java/software/xdev/testcontainers/imagebuilder/AbstractImageFromDockerfile.java b/testcontainers-advanced-imagebuilder/src/main/java/software/xdev/testcontainers/imagebuilder/AbstractImageFromDockerfile.java
index 5a30e41..0085977 100644
--- a/testcontainers-advanced-imagebuilder/src/main/java/software/xdev/testcontainers/imagebuilder/AbstractImageFromDockerfile.java
+++ b/testcontainers-advanced-imagebuilder/src/main/java/software/xdev/testcontainers/imagebuilder/AbstractImageFromDockerfile.java
@@ -263,6 +263,41 @@ protected Logger log()
@Override
protected abstract String resolve();
+ /**
+ * Creates a copy of the image-builder that will build the exact same image.
+ *
+ * NOTE: Requires {@link #createTransferFilesCache} to be set to true and an initial build, so that
+ * {@link #transferFileCache} is seeded.
+ *
+ */
+ public abstract S copyForExactRebuild(final String dockerImageName);
+
+ protected S copyForExactRebuild(final BiFunction createNewFunc, final String dockerImageName)
+ {
+ if(!this.createTransferFilesCache)
+ {
+ throw new IllegalStateException(
+ "createTransferFilesCache must be true to execute this operation");
+ }
+ if(this.transferFileCache == null)
+ {
+ throw new IllegalStateException("No transferFileCache. Did you build this image?");
+ }
+
+ final S image = createNewFunc.apply(dockerImageName, this.deleteOnExit)
+ .withBuildArgs(this.buildArgs)
+ .withLoggerForBuild(this.loggerForBuild)
+ .withCreateTransferFilesCache(false)
+ .withTransferFileCache(this.transferFileCache)
+ .withDisablePull(true);
+
+ this.optDockerFilePath.ifPresent(image::withDockerFilePath);
+ this.optBaseDir.ifPresent(image::withBaseDir);
+ this.optTarget.ifPresent(image::withTarget);
+
+ return image;
+ }
+
// region with
public S withLoggerForBuild(final Logger loggerForBuild)
@@ -485,6 +520,11 @@ public S withUseWinNTFSJunctionFixIfApplicable(
// endregion
+ public String getDockerImageName()
+ {
+ return this.dockerImageName;
+ }
+
@SuppressWarnings("unchecked")
protected S self()
{
diff --git a/testcontainers-advanced-imagebuilder/src/main/java/software/xdev/testcontainers/imagebuilder/AdvancedImageFromDockerFile.java b/testcontainers-advanced-imagebuilder/src/main/java/software/xdev/testcontainers/imagebuilder/AdvancedImageFromDockerFile.java
index 6048be5..0784f01 100644
--- a/testcontainers-advanced-imagebuilder/src/main/java/software/xdev/testcontainers/imagebuilder/AdvancedImageFromDockerFile.java
+++ b/testcontainers-advanced-imagebuilder/src/main/java/software/xdev/testcontainers/imagebuilder/AdvancedImageFromDockerFile.java
@@ -29,6 +29,7 @@
import java.util.Map.Entry;
import java.util.Optional;
import java.util.Set;
+import java.util.function.BiFunction;
import java.util.function.Consumer;
import java.util.zip.GZIPOutputStream;
@@ -259,6 +260,22 @@ protected void prepareImagePull(
state.setExternalDependencyImageNames(externalDependencyImageNames);
}
+ @Override
+ public AdvancedImageFromDockerFile copyForExactRebuild(final String dockerImageName)
+ {
+ return this.copyForExactRebuild(AdvancedImageFromDockerFile::new, dockerImageName);
+ }
+
+ @Override
+ protected AdvancedImageFromDockerFile copyForExactRebuild(
+ final BiFunction createNewFunc,
+ final String dockerImageName)
+ {
+ return super.copyForExactRebuild(createNewFunc, dockerImageName)
+ .withExplicitTransferables(this.explicitTransferables)
+ .withBuildImageCmdModifiers(this.buildImageCmdModifiers);
+ }
+
/**
* @see #copyForIntermediateTag(String, String)
*/
@@ -278,29 +295,7 @@ public AdvancedImageFromDockerFile copyForIntermediateTag(final String target)
public AdvancedImageFromDockerFile copyForIntermediateTag(
final String dockerImageName, final String target)
{
- if(!this.createTransferFilesCache)
- {
- throw new IllegalStateException(
- "createTransferFilesCache must be true to execute this operation");
- }
- if(this.transferFileCache == null)
- {
- throw new IllegalStateException("No transferFileCache. Did you build this image?");
- }
-
- return new AdvancedImageFromDockerFile(dockerImageName, this.deleteOnExit)
- // Copy defaults
- .withExplicitTransferables(this.explicitTransferables)
- .withBuildArgs(this.buildArgs)
- .withLoggerForBuild(this.loggerForBuild)
- .withDockerFilePath(this.optDockerFilePath.orElse(null))
- .withBaseDir(this.optBaseDir.orElse(null))
- .withBuildImageCmdModifiers(this.buildImageCmdModifiers)
- // Special
- .withCreateTransferFilesCache(false)
- .withTransferFileCache(this.transferFileCache)
- .withTarget(target)
- .withDisablePull(true);
+ return this.copyForExactRebuild(dockerImageName).withTarget(target);
}
public void cleanCreatedTransferFilesCache()
diff --git a/testcontainers-advanced-imagebuilder/src/main/java/software/xdev/testcontainers/imagebuilder/buildxnative/NativeAdvancedImageFromDockerfile.java b/testcontainers-advanced-imagebuilder/src/main/java/software/xdev/testcontainers/imagebuilder/buildxnative/NativeAdvancedImageFromDockerfile.java
index 426866a..b97a087 100644
--- a/testcontainers-advanced-imagebuilder/src/main/java/software/xdev/testcontainers/imagebuilder/buildxnative/NativeAdvancedImageFromDockerfile.java
+++ b/testcontainers-advanced-imagebuilder/src/main/java/software/xdev/testcontainers/imagebuilder/buildxnative/NativeAdvancedImageFromDockerfile.java
@@ -29,6 +29,7 @@
import java.util.UUID;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
+import java.util.function.BiFunction;
import java.util.function.Consumer;
import java.util.stream.Stream;
@@ -280,6 +281,28 @@ protected void logStream(final InputStream src, final Consumer logFunc)
}, this.executorService());
}
+ @Override
+ public NativeAdvancedImageFromDockerfile copyForExactRebuild(final String dockerImageName)
+ {
+ return this.copyForExactRebuild(NativeAdvancedImageFromDockerfile::new, dockerImageName);
+ }
+
+ @Override
+ protected NativeAdvancedImageFromDockerfile copyForExactRebuild(
+ final BiFunction createNewFunc,
+ final String dockerImageName)
+ {
+ final NativeAdvancedImageFromDockerfile image = super.copyForExactRebuild(createNewFunc, dockerImageName)
+ .withAdditionalArgs(this.additionalArgs)
+ .withLoad(this.load)
+ .withTimeout(this.timeout);
+
+ this.optCacheFrom.ifPresent(image::withCacheFrom);
+ this.optCacheTo.ifPresent(image::withCacheTo);
+
+ return image;
+ }
+
// region with
public NativeAdvancedImageFromDockerfile withBaseCommand(final List baseCommand)
diff --git a/testcontainers-advanced-imagebuilder/src/test/java/software/xdev/testcontainers/imagebuilder/buildxnative/NativeAdvancedImageFromDockerfileTest.java b/testcontainers-advanced-imagebuilder/src/test/java/software/xdev/testcontainers/imagebuilder/buildxnative/NativeAdvancedImageFromDockerfileTest.java
index 4d7e791..96a1b6d 100644
--- a/testcontainers-advanced-imagebuilder/src/test/java/software/xdev/testcontainers/imagebuilder/buildxnative/NativeAdvancedImageFromDockerfileTest.java
+++ b/testcontainers-advanced-imagebuilder/src/test/java/software/xdev/testcontainers/imagebuilder/buildxnative/NativeAdvancedImageFromDockerfileTest.java
@@ -49,6 +49,7 @@ void checkGitHubCaching()
if(System.getenv("GITHUB_ACTIONS") == null)
{
Assumptions.abort("Not running on GitHub Actions");
+ return;
}
this.checkIfDockerIsPresentOrAbort();