Skip to content

Commit 1ce9a4c

Browse files
committed
Do not transfer mountable file when tar name is "." or ".." (docker is unable to use this files)
1 parent 6f7b17a commit 1ce9a4c

File tree

3 files changed

+48
-1
lines changed

3 files changed

+48
-1
lines changed

core/src/main/java/org/testcontainers/images/builder/traits/FilesTrait.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import org.testcontainers.utility.MountableFile;
44

55
import java.io.File;
6+
import java.nio.file.Files;
67
import java.nio.file.Path;
78

89
/**
@@ -50,6 +51,10 @@ default SELF withFileFromFile(String path, File file, Integer mode) {
5051
* @return self
5152
*/
5253
default SELF withFileFromPath(String path, Path filePath, Integer mode) {
54+
final boolean fileStoredToDir = Files.isRegularFile(filePath) && (".".equals(path) || "..".equals(path));
55+
if (fileStoredToDir) {
56+
throw new IllegalArgumentException("Unable to store file '" + filePath + "' to docker path '" + path + "'");
57+
}
5358
final MountableFile mountableFile = MountableFile.forHostPath(filePath, mode);
5459
return ((SELF) this).withFileFromTransferable(path, mountableFile);
5560
}

core/src/main/java/org/testcontainers/utility/MountableFile.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,7 @@ private void recursiveTar(String entryFilename, String rootPath, String itemPath
322322
tarEntry.setMode(getUnixFileMode(itemPath));
323323
tarArchive.putArchiveEntry(tarEntry);
324324

325+
log.trace("Transferring {} '{}'", sourceFile.isFile() ? "file" : "directory", sourceFile);
325326
if (sourceFile.isFile()) {
326327
Files.copy(sourceFile.toPath(), tarArchive);
327328
}
@@ -377,7 +378,7 @@ public static int getUnixFileMode(final Path path) {
377378
// Truncate mode bits for z/OS
378379
if ("OS/390".equals(SystemUtils.OS_NAME) ||
379380
"z/OS".equals(SystemUtils.OS_NAME) ||
380-
"zOS".equals(SystemUtils.OS_NAME) ) {
381+
"zOS".equals(SystemUtils.OS_NAME)) {
381382
unixMode &= TarConstants.MAXID;
382383
unixMode |= Files.isDirectory(path) ? 040000 : 0100000;
383384
}

core/src/test/java/org/testcontainers/utility/DirectoryTarResourceTest.java

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,13 @@
44
import org.hamcrest.Matcher;
55
import org.hamcrest.core.IsCollectionContaining;
66
import org.junit.Test;
7+
import org.rnorth.visibleassertions.VisibleAssertions;
78
import org.testcontainers.containers.GenericContainer;
89
import org.testcontainers.containers.startupcheck.OneShotStartupCheckStrategy;
910
import org.testcontainers.images.builder.ImageFromDockerfile;
1011

1112
import java.io.File;
13+
import java.nio.file.Paths;
1214
import java.util.Arrays;
1315

1416
import static org.hamcrest.CoreMatchers.allOf;
@@ -61,6 +63,45 @@ public void simpleRecursiveFileWithPermissionTest() {
6163
exactlyNItems(1, allOf(containsString("-rwxr-xr--"), containsString("foo"))));
6264
}
6365

66+
@Test
67+
public void transferFileDockerDaemon() {
68+
GenericContainer container = new GenericContainer(
69+
new ImageFromDockerfile()
70+
.withDockerfileFromBuilder(builder ->
71+
builder.from("alpine:3.3")
72+
.copy("bar", "/foo/")
73+
.cmd("ls", "-al", "/foo")
74+
.build()
75+
).withFileFromFile("bar", new File("src/test/resources/mappable-resource/test-resource.txt"),
76+
0754))
77+
.withStartupCheckStrategy(new OneShotStartupCheckStrategy());
78+
79+
container.start();
80+
String listing = container.getLogs();
81+
82+
assertThat("Listing shows that file is copied.",
83+
Arrays.asList(listing.split("\\n")),
84+
exactlyNItems(1, allOf(containsString("-rwxr-xr--"), containsString("bar"))));
85+
}
86+
87+
@Test
88+
public void unableToTransferFileNamedDotToDockerDaemon() {
89+
VisibleAssertions.assertThrows("Unable to store file '" +
90+
Paths.get("src", "test", "resources", "mappable-resource", "test-resource.txt") + "' to docker path '.'",
91+
IllegalArgumentException.class, () -> {
92+
new GenericContainer(
93+
new ImageFromDockerfile()
94+
.withDockerfileFromBuilder(builder ->
95+
builder.from("alpine:3.3")
96+
.copy(".", "/foo/")
97+
.cmd("ls", "-al", "/foo")
98+
.build()
99+
).withFileFromFile(".", new File("src/test/resources/mappable-resource/test-resource.txt"),
100+
0754))
101+
.withStartupCheckStrategy(new OneShotStartupCheckStrategy());
102+
});
103+
}
104+
64105
@Test
65106
public void simpleRecursiveClasspathResourceTest() {
66107
// This test combines the copying of classpath resources from JAR files with the recursive TAR approach, to allow JARed classpath resources to be copied in to an image

0 commit comments

Comments
 (0)