Skip to content

Commit 19ced4f

Browse files
committed
Improve FileContentModifier
1 parent c8bb340 commit 19ced4f

File tree

15 files changed

+226
-42
lines changed

15 files changed

+226
-42
lines changed

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
# 2.1.0
2+
* Add customizer for ``TransferArchiveTARCompressor``
3+
* Create more predefined FileContentModifiers
4+
* This allows to e.g. remove not needed Maven modules when building
5+
16
# 2.0.2
27
* Don't try to pull reserved ``scratch`` image during build
38

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
<groupId>software.xdev</groupId>
88
<artifactId>testcontainers-advanced-imagebuilder-root</artifactId>
9-
<version>2.0.3-SNAPSHOT</version>
9+
<version>2.1.0-SNAPSHOT</version>
1010
<packaging>pom</packaging>
1111

1212
<organization>

testcontainers-advanced-imagebuilder-demo/pom.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@
77
<parent>
88
<groupId>software.xdev</groupId>
99
<artifactId>testcontainers-advanced-imagebuilder-root</artifactId>
10-
<version>2.0.3-SNAPSHOT</version>
10+
<version>2.1.0-SNAPSHOT</version>
1111
</parent>
1212

1313
<artifactId>testcontainers-advanced-imagebuilder-demo</artifactId>
14-
<version>2.0.3-SNAPSHOT</version>
14+
<version>2.1.0-SNAPSHOT</version>
1515
<packaging>jar</packaging>
1616

1717
<organization>

testcontainers-advanced-imagebuilder-demo/src/main/java/software/xdev/Application.java

Lines changed: 41 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
package software.xdev;
22

3+
import java.nio.file.Path;
34
import java.nio.file.Paths;
5+
import java.util.List;
46

7+
import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
58
import org.slf4j.LoggerFactory;
69

710
import software.xdev.testcontainers.imagebuilder.AdvancedImageFromDockerFile;
811
import software.xdev.testcontainers.imagebuilder.compat.DockerfileCOPYParentsEmulator;
12+
import software.xdev.testcontainers.imagebuilder.transfer.fcm.FileLinesContentModifier;
913

1014

1115
public final class Application
@@ -25,13 +29,46 @@ public static void main(final String[] args)
2529
".md",
2630
".cmd",
2731
"/renovate.json5",
28-
// We need to keep the pom.xml as maven can't resolve the modules otherwise
29-
"testcontainers-advanced-imagebuilder/src/**",
30-
"testcontainers-advanced-imagebuilder-demo/src/**"
32+
"testcontainers-advanced-imagebuilder/**",
33+
"testcontainers-advanced-imagebuilder-demo/**"
3134
)
3235
.withDockerFilePath(Paths.get("../testcontainers-advanced-imagebuilder-demo/Dockerfile"))
3336
.withBaseDir(Paths.get("../"))
34-
.withDockerFileLinesModifier(new DockerfileCOPYParentsEmulator());
37+
.withDockerFileLinesModifier(new DockerfileCOPYParentsEmulator())
38+
// Only copy the required maven modules and remove the not required ones
39+
.withTransferArchiveTARCompressorCustomizer(c -> c.withContentModifier(
40+
new FileLinesContentModifier()
41+
{
42+
@Override
43+
public boolean shouldApply(
44+
final Path sourcePath,
45+
final String targetPath,
46+
final TarArchiveEntry tarArchiveEntry)
47+
{
48+
return "pom.xml".equals(targetPath);
49+
}
50+
51+
@Override
52+
public List<String> modify(
53+
final List<String> lines,
54+
final Path sourcePath,
55+
final String targetPath,
56+
final TarArchiveEntry tarArchiveEntry)
57+
{
58+
return lines.stream()
59+
// Only keep the dummy-app submodule as this is only needed for building
60+
.filter(s -> !(s.contains("<module>testcontainers-advanced-imagebuilder")
61+
&& !s.contains("<module>testcontainers-advanced-imagebuilder-dummy-app")))
62+
.toList();
63+
}
64+
65+
@Override
66+
public boolean isIdentical(final List<String> original, final List<String> created)
67+
{
68+
return original.size() == created.size();
69+
}
70+
}
71+
));
3572

3673
final String imageName = builder.get();
3774

testcontainers-advanced-imagebuilder-dummy-app/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
<groupId>software.xdev</groupId>
88
<artifactId>testcontainers-advanced-imagebuilder-dummy-app</artifactId>
9-
<version>2.0.3-SNAPSHOT</version>
9+
<version>2.1.0-SNAPSHOT</version>
1010
<packaging>jar</packaging>
1111

1212
<organization>

testcontainers-advanced-imagebuilder/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
<groupId>software.xdev</groupId>
88
<artifactId>testcontainers-advanced-imagebuilder</artifactId>
9-
<version>2.0.3-SNAPSHOT</version>
9+
<version>2.1.0-SNAPSHOT</version>
1010
<packaging>jar</packaging>
1111

1212
<name>testcontainers-advanced-imagebuilder</name>

testcontainers-advanced-imagebuilder/src/main/java/software/xdev/testcontainers/imagebuilder/AdvancedImageFromDockerFile.java

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,11 +66,11 @@
6666
import com.github.dockerjava.api.model.BuildResponseItem;
6767

6868
import software.xdev.testcontainers.imagebuilder.transfer.DefaultTransferFilesCreator;
69-
import software.xdev.testcontainers.imagebuilder.transfer.DockerFileContentModifier;
7069
import software.xdev.testcontainers.imagebuilder.transfer.DockerFileLineModifier;
7170
import software.xdev.testcontainers.imagebuilder.transfer.FastFilePathUtil;
7271
import software.xdev.testcontainers.imagebuilder.transfer.TransferArchiveTARCompressor;
7372
import software.xdev.testcontainers.imagebuilder.transfer.TransferFilesCreator;
73+
import software.xdev.testcontainers.imagebuilder.transfer.fcm.DockerFileContentModifier;
7474

7575

7676
/**
@@ -114,6 +114,7 @@ public class AdvancedImageFromDockerFile
114114
protected BiFunction<Path, Path, TransferFilesCreator> transferFilesCreatorSupplier =
115115
DefaultTransferFilesCreator::new;
116116
protected TransferArchiveTARCompressor transferArchiveTARCompressor = new TransferArchiveTARCompressor();
117+
protected Consumer<TransferArchiveTARCompressor> transferArchiveTARCompressorCustomizer;
117118
protected TriFunction<Path, List<DockerFileLineModifier>, Collection<String>, DockerFileContentModifier>
118119
dockerFileContentModifierSupplier = DockerFileContentModifier::new;
119120
protected List<DockerFileLineModifier> dockerFileLinesModifiers = new ArrayList<>();
@@ -161,6 +162,7 @@ protected String resolve()
161162
final Logger logger = Optional.ofNullable(this.loggerForBuild)
162163
.orElseGet(() -> DockerLoggerFactory.getLogger(this.dockerImageName));
163164

165+
@SuppressWarnings("resource")
164166
final DockerClient dockerClient = DockerClientFactory.instance().client();
165167

166168
this.log().info("Starting resolving image[name='{}']", this.dockerImageName);
@@ -381,8 +383,14 @@ protected void configure(final BuildImageCmd buildImageCmd)
381383
this.transferArchiveTARCompressor.withContentModifier(dockerFileContentModifier);
382384
}
383385
}
386+
387+
if(this.transferArchiveTARCompressorCustomizer != null)
388+
{
389+
this.transferArchiveTARCompressorCustomizer.accept(this.transferArchiveTARCompressor);
390+
}
391+
384392
buildImageCmd.withTarInputStream(tfc.getAllFilesToTransferAsTarInputStream(
385-
filesToTransfer.keySet(),
393+
filesToTransfer,
386394
this.transferArchiveTARCompressor));
387395

388396
this.log().info(
@@ -564,6 +572,13 @@ public AdvancedImageFromDockerFile withTransferArchiveTARCompressor(
564572
return this;
565573
}
566574

575+
public AdvancedImageFromDockerFile withTransferArchiveTARCompressorCustomizer(
576+
final Consumer<TransferArchiveTARCompressor> customizer)
577+
{
578+
this.transferArchiveTARCompressorCustomizer = customizer;
579+
return this;
580+
}
581+
567582
public AdvancedImageFromDockerFile withDockerFileContentModifierSupplier(
568583
final TriFunction<Path, List<DockerFileLineModifier>, Collection<String>, DockerFileContentModifier>
569584
dockerFileContentModifierSupplier)

testcontainers-advanced-imagebuilder/src/main/java/software/xdev/testcontainers/imagebuilder/transfer/DefaultTransferFilesCreator.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
import java.nio.file.Files;
2424
import java.nio.file.Path;
2525
import java.util.ArrayList;
26-
import java.util.Collection;
2726
import java.util.LinkedHashMap;
2827
import java.util.LinkedHashSet;
2928
import java.util.List;
@@ -271,14 +270,13 @@ else if(result == IgnoreNode.MatchResult.IGNORED)
271270
@Override
272271
@SuppressWarnings({"java:S2095", "resource"}) // Can't close an InputStream that is returned...
273272
public InputStream getAllFilesToTransferAsTarInputStream(
274-
final Collection<Path> filesToTransfer,
273+
final Map<Path, String> filesToTransfer,
275274
final TransferArchiveTARCompressor transferArchiveTARCompressor)
276275
{
277276
File dockerFolderTar = null;
278277
try
279278
{
280279
dockerFolderTar = transferArchiveTARCompressor.archiveTARFiles(
281-
this.baseDir.toFile(),
282280
filesToTransfer,
283281
UUID.randomUUID().toString());
284282
final File dockerFolderTarInner = dockerFolderTar;

testcontainers-advanced-imagebuilder/src/main/java/software/xdev/testcontainers/imagebuilder/transfer/TransferArchiveTARCompressor.java

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,16 @@
2525
import java.nio.file.Path;
2626
import java.util.ArrayList;
2727
import java.util.List;
28+
import java.util.Map;
2829
import java.util.zip.GZIPOutputStream;
2930

3031
import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
3132
import org.apache.commons.compress.archivers.tar.TarArchiveOutputStream;
3233
import org.testcontainers.shaded.org.apache.commons.io.FileUtils;
3334
import org.testcontainers.shaded.org.apache.commons.io.IOUtils;
3435

36+
import software.xdev.testcontainers.imagebuilder.transfer.fcm.FileContentModifier;
37+
3538

3639
/**
3740
* Forked from {@link org.testcontainers.shaded.com.github.dockerjava.core.util.CompressArchiveUtil} to allow file
@@ -48,8 +51,7 @@ public TransferArchiveTARCompressor withContentModifier(final FileContentModifie
4851
}
4952

5053
public File archiveTARFiles(
51-
final File base,
52-
final Iterable<Path> filesPaths,
54+
final Map<Path, String> filesToTransfer,
5355
final String archiveNameWithOutExtension) throws IOException
5456
{
5557
final File tarFile = new File(FileUtils.getTempDirectoryPath(), archiveNameWithOutExtension + ".tar");
@@ -62,9 +64,9 @@ public File archiveTARFiles(
6264
tos.setLongFileMode(3);
6365
tos.setBigNumberMode(2);
6466

65-
for(final Path filePath : filesPaths)
67+
for(final Map.Entry<Path, String> fileData : filesToTransfer.entrySet())
6668
{
67-
this.addFileToTar(tos, filePath, FastFilePathUtil.relativize(base.toPath(), filePath));
69+
this.addFileToTar(tos, fileData.getKey(), fileData.getValue());
6870
}
6971
}
7072

@@ -74,34 +76,34 @@ public File archiveTARFiles(
7476
@SuppressWarnings("checkstyle:MagicNumber")
7577
protected void addFileToTar(
7678
final TarArchiveOutputStream tarArchiveOutputStream,
77-
final Path file,
78-
final String entryName
79+
final Path sourePath,
80+
final String targetPath
7981
) throws IOException
8082
{
8183
try
8284
{
83-
if(Files.isSymbolicLink(file))
85+
if(Files.isSymbolicLink(sourePath))
8486
{
85-
final TarArchiveEntry tarArchiveEntry = new TarArchiveEntry(entryName, (byte)50);
86-
tarArchiveEntry.setLinkName(Files.readSymbolicLink(file).toString());
87+
final TarArchiveEntry tarArchiveEntry = new TarArchiveEntry(targetPath, (byte)50);
88+
tarArchiveEntry.setLinkName(Files.readSymbolicLink(sourePath).toString());
8789
tarArchiveOutputStream.putArchiveEntry(tarArchiveEntry);
8890
return;
8991
}
9092

9193
final TarArchiveEntry tarArchiveEntry =
92-
(TarArchiveEntry)tarArchiveOutputStream.createArchiveEntry(file.toFile(), entryName);
93-
if(file.toFile().canExecute())
94+
(TarArchiveEntry)tarArchiveOutputStream.createArchiveEntry(sourePath.toFile(), targetPath);
95+
if(sourePath.toFile().canExecute())
9496
{
9597
tarArchiveEntry.setMode(tarArchiveEntry.getMode() | 493);
9698
}
9799

98-
if(!file.toFile().isFile())
100+
if(!sourePath.toFile().isFile())
99101
{
100102
tarArchiveOutputStream.putArchiveEntry(tarArchiveEntry);
101103
return;
102104
}
103105

104-
try(final InputStream input = this.createInputStreamForFile(file, tarArchiveEntry))
106+
try(final InputStream input = this.createInputStreamForFile(sourePath, targetPath, tarArchiveEntry))
105107
{
106108
// put it after it was modified
107109
tarArchiveOutputStream.putArchiveEntry(tarArchiveEntry);
@@ -114,17 +116,20 @@ protected void addFileToTar(
114116
}
115117
}
116118

117-
protected InputStream createInputStreamForFile(final Path filePath, final TarArchiveEntry tarArchiveEntry)
119+
protected InputStream createInputStreamForFile(
120+
final Path sourePath,
121+
final String targetPath,
122+
final TarArchiveEntry tarArchiveEntry)
118123
throws IOException
119124
{
120125
for(final FileContentModifier fcm : this.fileContentModifiers)
121126
{
122-
final InputStream is = fcm.apply(filePath, tarArchiveEntry);
127+
final InputStream is = fcm.apply(sourePath, targetPath, tarArchiveEntry);
123128
if(is != null)
124129
{
125130
return is;
126131
}
127132
}
128-
return new BufferedInputStream(Files.newInputStream(filePath));
133+
return new BufferedInputStream(Files.newInputStream(sourePath));
129134
}
130135
}

testcontainers-advanced-imagebuilder/src/main/java/software/xdev/testcontainers/imagebuilder/transfer/TransferFilesCreator.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717

1818
import java.io.InputStream;
1919
import java.nio.file.Path;
20-
import java.util.Collection;
2120
import java.util.Map;
2221
import java.util.Set;
2322
import java.util.function.Predicate;
@@ -32,6 +31,6 @@ Map<Path, String> determineFilesToTransfer(
3231
Set<String> alwaysIncludedRelativePaths);
3332

3433
InputStream getAllFilesToTransferAsTarInputStream(
35-
Collection<Path> filesToTransfer,
34+
Map<Path, String> filesToTransfer,
3635
TransferArchiveTARCompressor transferArchiveTARCompressor);
3736
}

0 commit comments

Comments
 (0)