From 28e11ed2af5ea3ef3dc73a067467d9fb9f8bda19 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Wed, 11 May 2016 21:23:51 +0200 Subject: [PATCH] Fix issue #551 --- .../core/command/BuildImageCmdImpl.java | 2 +- .../core/dockerfile/Dockerfile.java | 26 ++++++++++++------- .../core/command/BuildImageCmdImplTest.java | 19 ++++++++++++-- .../DockerfileAddMultipleFilesTest.java | 2 +- .../core/dockerfile/DockerfileTest.java | 2 +- .../dockerfileFolder/Dockerfile | 7 +++++ .../testrunFolder/testrun.sh | 3 +++ 7 files changed, 46 insertions(+), 15 deletions(-) create mode 100644 src/test/resources/testDockerfileNotInBaseDirectory/dockerfileFolder/Dockerfile create mode 100755 src/test/resources/testDockerfileNotInBaseDirectory/testrunFolder/testrun.sh diff --git a/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java index 58f148cb6..487f0b264 100644 --- a/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java @@ -272,7 +272,7 @@ public BuildImageCmdImpl withDockerfile(File dockerfile) { this.dockerFile = dockerfile; try { - withTarInputStream(new Dockerfile(dockerfile).parse().buildDockerFolderTar(baseDirectory)); + withTarInputStream(new Dockerfile(dockerfile, baseDirectory).parse().buildDockerFolderTar()); } catch (IOException e) { // we just created the file this should never happen. throw new RuntimeException(e); diff --git a/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java b/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java index 8c1c34e2a..c970d6c2d 100644 --- a/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java +++ b/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java @@ -31,8 +31,9 @@ public class Dockerfile { public final File dockerFile; - public Dockerfile(File dockerFile) { + private final File baseDirectory; + public Dockerfile(File dockerFile, File baseDirectory) { if (!dockerFile.exists()) { throw new IllegalStateException(String.format("Dockerfile %s does not exist", dockerFile.getAbsolutePath())); } @@ -43,6 +44,15 @@ public Dockerfile(File dockerFile) { this.dockerFile = dockerFile; + if (!baseDirectory.exists()) { + throw new IllegalStateException(String.format("Base directory %s does not exist", baseDirectory.getAbsolutePath())); + } + + if (!baseDirectory.isDirectory()) { + throw new IllegalStateException(String.format("Base directory %s is not a directory", baseDirectory.getAbsolutePath())); + } + + this.baseDirectory = baseDirectory; } private static class LineTransformer implements Function> { @@ -76,7 +86,7 @@ public Iterable getStatements() throws IOException { public List getIgnores() throws IOException { List ignores = new ArrayList(); - File dockerIgnoreFile = new File(getDockerFolder(), ".dockerignore"); + File dockerIgnoreFile = new File(baseDirectory, ".dockerignore"); if (dockerIgnoreFile.exists()) { int lineNumber = 0; List dockerIgnoreFileContent = FileUtils.readLines(dockerIgnoreFile); @@ -102,10 +112,6 @@ public ScannedResult parse() throws IOException { return new ScannedResult(); } - public File getDockerFolder() { - return dockerFile.getParentFile(); - } - /** * Result of scanning / parsing a docker file. */ @@ -116,7 +122,7 @@ public class ScannedResult { final List filesToAdd = new ArrayList(); public InputStream buildDockerFolderTar() { - return buildDockerFolderTar(getDockerFolder()); + return buildDockerFolderTar(baseDirectory); } public InputStream buildDockerFolderTar(File directory) { @@ -180,7 +186,7 @@ public ScannedResult() throws IOException { "Dockerfile is excluded by pattern '%s' in .dockerignore file", matchingIgnorePattern)); } - Collection filesInBuildContext = FileUtils.listFiles(getDockerFolder(), TrueFileFilter.INSTANCE, + Collection filesInBuildContext = FileUtils.listFiles(baseDirectory, TrueFileFilter.INSTANCE, TrueFileFilter.INSTANCE); for (File f : filesInBuildContext) { @@ -217,7 +223,7 @@ private List matchingIgnorePatterns(String fileName) { * will be respected. */ private String effectiveMatchingIgnorePattern(File file) { - String relativeFilename = FilePathUtil.relativize(getDockerFolder(), file); + String relativeFilename = FilePathUtil.relativize(baseDirectory, file); List matchingPattern = matchingIgnorePatterns(relativeFilename); @@ -242,6 +248,6 @@ private String effectiveMatchingIgnorePattern(File file) { } return lastMatchingPattern; - } + } } } diff --git a/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java index c0dc967d4..950b80a24 100644 --- a/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java @@ -24,16 +24,15 @@ import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; -import com.github.dockerjava.api.exception.DockerClientException; import com.github.dockerjava.api.command.BuildImageCmd; import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.api.command.InspectContainerResponse; import com.github.dockerjava.api.command.InspectImageResponse; +import com.github.dockerjava.api.exception.DockerClientException; import com.github.dockerjava.api.model.AuthConfig; import com.github.dockerjava.api.model.AuthConfigurations; import com.github.dockerjava.api.model.ExposedPort; import com.github.dockerjava.api.model.PortBinding; -import com.github.dockerjava.api.model.Ports; import com.github.dockerjava.api.model.Ports.Binding; import com.github.dockerjava.client.AbstractDockerClientTest; import com.github.dockerjava.core.util.CompressArchiveUtil; @@ -319,4 +318,20 @@ public void testBuildArgs() throws Exception { assertThat(inspectImageResponse.getConfig().getLabels().get("test"), equalTo("abc")); } + + public void testDockerfileNotInBaseDirectory() throws Exception { + File baseDirectory = getResource("testDockerfileNotInBaseDirectory"); + File dockerfile = getResource("testDockerfileNotInBaseDirectory/dockerfileFolder/Dockerfile"); + BuildImageCmd command = dockerClient.buildImageCmd() + .withBaseDirectory(baseDirectory) + .withDockerfile(dockerfile); + + String response = execBuild(command); + + assertThat(response, containsString("Successfully executed testrun.sh")); + } + + private File getResource(String path) { + return new File(Thread.currentThread().getContextClassLoader().getResource(path).getFile()); + } } diff --git a/src/test/java/com/github/dockerjava/core/dockerfile/DockerfileAddMultipleFilesTest.java b/src/test/java/com/github/dockerjava/core/dockerfile/DockerfileAddMultipleFilesTest.java index 0752aded5..8997a6d80 100644 --- a/src/test/java/com/github/dockerjava/core/dockerfile/DockerfileAddMultipleFilesTest.java +++ b/src/test/java/com/github/dockerjava/core/dockerfile/DockerfileAddMultipleFilesTest.java @@ -29,7 +29,7 @@ public String apply(File file) { public void testAddMultipleFiles() throws IOException { File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("testAddMultipleFiles") .getFile()); - Dockerfile dockerfile = new Dockerfile(new File(baseDir, "Dockerfile")); + Dockerfile dockerfile = new Dockerfile(new File(baseDir, "Dockerfile"), baseDir); Dockerfile.ScannedResult result = dockerfile.parse(); Collection filesToAdd = transform(result.filesToAdd, TO_FILE_NAMES); diff --git a/src/test/java/com/github/dockerjava/core/dockerfile/DockerfileTest.java b/src/test/java/com/github/dockerjava/core/dockerfile/DockerfileTest.java index ba96ad2eb..390bcf647 100644 --- a/src/test/java/com/github/dockerjava/core/dockerfile/DockerfileTest.java +++ b/src/test/java/com/github/dockerjava/core/dockerfile/DockerfileTest.java @@ -26,7 +26,7 @@ public void testAllItems() throws IOException { for (File child : root.listFiles()) { if (new File(child, "Dockerfile").exists()) { - Dockerfile dockerfile = new Dockerfile(new File(child, "Dockerfile")); + Dockerfile dockerfile = new Dockerfile(new File(child, "Dockerfile"), baseDir); dockerfiles.put(child.getName(), dockerfile); } } diff --git a/src/test/resources/testDockerfileNotInBaseDirectory/dockerfileFolder/Dockerfile b/src/test/resources/testDockerfileNotInBaseDirectory/dockerfileFolder/Dockerfile new file mode 100644 index 000000000..9bf10088b --- /dev/null +++ b/src/test/resources/testDockerfileNotInBaseDirectory/dockerfileFolder/Dockerfile @@ -0,0 +1,7 @@ +FROM ubuntu:latest + +ADD testrunFolder/testrun.sh /tmp/ + +RUN cp /tmp/testrun.sh /usr/local/bin/ && chmod +x /usr/local/bin/testrun.sh + +CMD ["testrun.sh"] \ No newline at end of file diff --git a/src/test/resources/testDockerfileNotInBaseDirectory/testrunFolder/testrun.sh b/src/test/resources/testDockerfileNotInBaseDirectory/testrunFolder/testrun.sh new file mode 100755 index 000000000..14259aa77 --- /dev/null +++ b/src/test/resources/testDockerfileNotInBaseDirectory/testrunFolder/testrun.sh @@ -0,0 +1,3 @@ +#!/bin/sh + +echo "Successfully executed testrun.sh" \ No newline at end of file