Skip to content

Commit 08b617b

Browse files
author
Łukasz Warchał
committed
Include empty directories in build context
1 parent 41dc114 commit 08b617b

File tree

2 files changed

+36
-7
lines changed

2 files changed

+36
-7
lines changed

src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java

Lines changed: 34 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
import org.apache.commons.io.FileUtils;
1313
import org.apache.commons.io.FilenameUtils;
1414
import org.apache.commons.io.IOUtils;
15-
import org.apache.commons.io.filefilter.TrueFileFilter;
1615

1716
import com.github.dockerjava.api.exception.DockerClientException;
1817
import com.github.dockerjava.core.GoLangFileMatch;
@@ -186,16 +185,45 @@ public ScannedResult() throws IOException {
186185
"Dockerfile is excluded by pattern '%s' in .dockerignore file", matchingIgnorePattern));
187186
}
188187

189-
Collection<File> filesInBuildContext = FileUtils.listFiles(baseDirectory, TrueFileFilter.INSTANCE,
190-
TrueFileFilter.INSTANCE);
188+
addFilesInDirectory(baseDirectory);
189+
}
191190

192-
for (File f : filesInBuildContext) {
193-
if (effectiveMatchingIgnorePattern(f) == null) {
194-
filesToAdd.add(f);
191+
/**
192+
* Adds all files found in <code>directory</code> and subdirectories to
193+
* <code>filesToAdd</code> collection. It also adds any empty directories
194+
* if found.
195+
*
196+
* @param directory directory
197+
* @throws DockerClientException when IO error occurs
198+
*/
199+
private void addFilesInDirectory(File directory) {
200+
File[] files = directory.listFiles();
201+
202+
if (files == null) {
203+
throw new DockerClientException("Failed to read build context directory: " + baseDirectory.getAbsolutePath());
204+
}
205+
206+
if (files.length != 0) {
207+
for (File f : files) {
208+
if (effectiveMatchingIgnorePattern(f) == null) {
209+
if (f.isDirectory()) {
210+
addFilesInDirectory(f);
211+
} else {
212+
filesToAdd.add(f);
213+
}
214+
}
195215
}
216+
// base directory should at least contains Dockerfile, but better check
217+
} else if (!isBaseDirectory(directory)) {
218+
// add empty directory
219+
filesToAdd.add(directory);
196220
}
197221
}
198222

223+
private boolean isBaseDirectory(File directory) {
224+
return directory.compareTo(baseDirectory) == 0;
225+
}
226+
199227
/**
200228
* Returns all matching ignore patterns for the given file name.
201229
*/

src/test/java/com/github/dockerjava/core/dockerfile/DockerfileAddMultipleFilesTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,11 +59,12 @@ public void ineffectiveIgnorePattern() throws Exception {
5959
@Test
6060
public void addFiles() throws IOException {
6161
File baseDir = fileFromBuildTestResource("ADD/files");
62+
new File(baseDir, "emptydir").mkdir();
6263
Dockerfile dockerfile = new Dockerfile(new File(baseDir, "Dockerfile"), baseDir);
6364
Dockerfile.ScannedResult result = dockerfile.parse();
6465
Collection<String> filesToAdd = transform(result.filesToAdd, TO_FILE_NAMES);
6566

66-
assertThat(filesToAdd, containsInAnyOrder("Dockerfile", "src1", "src2"));
67+
assertThat(filesToAdd, containsInAnyOrder("emptydir", "Dockerfile", "src1", "src2"));
6768
}
6869

6970
private File fileFromBuildTestResource(String resource) {

0 commit comments

Comments
 (0)