From ce97d493d1f15e3e1070d09a69c82b39797e70b5 Mon Sep 17 00:00:00 2001 From: Artur Ossowski Date: Tue, 19 Apr 2016 08:48:00 +0200 Subject: [PATCH 1/2] Added base directory to Dockerfile class - fixed adding files to tar --- .../core/command/BuildImageCmdImpl.java | 2 +- .../core/dockerfile/Dockerfile.java | 28 +++++++++++-------- .../DockerfileAddMultipleFilesTest.java | 2 +- .../core/dockerfile/DockerfileTest.java | 2 +- 4 files changed, 19 insertions(+), 15 deletions(-) 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 4be5a4ede..cd0c6b85d 100644 --- a/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java @@ -286,7 +286,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 38f40fc7a..930cf5d85 100644 --- a/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java +++ b/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java @@ -33,8 +33,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())); } @@ -45,6 +46,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> { @@ -78,7 +88,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); @@ -104,10 +114,6 @@ public ScannedResult parse() throws IOException { return new ScannedResult(); } - public File getDockerFolder() { - return dockerFile.getParentFile(); - } - /** * Result of scanning / parsing a docker file. */ @@ -120,7 +126,7 @@ public class ScannedResult { final List filesToAdd = new ArrayList(); public InputStream buildDockerFolderTar() { - return buildDockerFolderTar(getDockerFolder()); + return buildDockerFolderTar(baseDirectory); } public InputStream buildDockerFolderTar(File directory) { @@ -215,7 +221,7 @@ private List matchingIgnorePatterns(String fileName) { * like "!Dockerfile" will be respected. */ private String effectiveMatchingIgnorePattern(File file) { - String relativeFilename = FilePathUtil.relativize(getDockerFolder(), file); + String relativeFilename = FilePathUtil.relativize(baseDirectory, file); List matchingPattern = matchingIgnorePatterns(relativeFilename); @@ -245,14 +251,12 @@ private void processAddStatement(DockerfileStatement.Add add) throws IOException for (String resource : add.getFileResources()) { - File dockerFolder = getDockerFolder(); - File src = new File(resource); if (!src.isAbsolute()) { - src = new File(dockerFolder, resource); + src = new File(baseDirectory, resource); } else { throw new DockerClientException(String.format("Source file %s must be relative to %s", src, - dockerFolder)); + baseDirectory)); } if (src.exists()) { 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 c69529d02..923de0bd8 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); } } From eb27297721661bd17b2c710cc968555a479b1580 Mon Sep 17 00:00:00 2001 From: Artur Ossowski Date: Mon, 9 May 2016 11:12:11 +0200 Subject: [PATCH 2/2] Test added for case dockerfile not in base directory --- .../core/command/BuildImageCmdImplTest.java | 59 ++++++++++--------- .../dockerfileFolder/Dockerfile | 7 +++ .../testrunFolder/testrun.sh | 3 + 3 files changed, 41 insertions(+), 28 deletions(-) create mode 100644 src/test/resources/testDockerfileNotInBaseDirectory/dockerfileFolder/Dockerfile create mode 100755 src/test/resources/testDockerfileNotInBaseDirectory/testrunFolder/testrun.sh 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 22030cc9f..c31108054 100644 --- a/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java @@ -1,12 +1,17 @@ package com.github.dockerjava.core.command; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.containsString; -import static org.hamcrest.Matchers.equalTo; -import static org.hamcrest.Matchers.isEmptyString; -import static org.hamcrest.Matchers.not; -import static org.hamcrest.Matchers.notNullValue; -import static org.hamcrest.Matchers.nullValue; +import com.github.dockerjava.api.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.model.*; +import com.github.dockerjava.client.AbstractDockerClientTest; +import com.github.dockerjava.core.CompressArchiveUtil; +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.filefilter.TrueFileFilter; +import org.testng.ITestResult; +import org.testng.annotations.*; import java.io.File; import java.io.FileInputStream; @@ -15,27 +20,8 @@ import java.util.Collection; import java.util.UUID; -import org.apache.commons.io.FileUtils; -import org.apache.commons.io.filefilter.TrueFileFilter; -import org.testng.ITestResult; -import org.testng.annotations.AfterMethod; -import org.testng.annotations.AfterTest; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.BeforeTest; -import org.testng.annotations.Test; - -import com.github.dockerjava.api.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.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.client.AbstractDockerClientTest; -import com.github.dockerjava.core.CompressArchiveUtil; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.*; @Test(groups = "integration") public class BuildImageCmdImplTest extends AbstractDockerClientTest { @@ -290,4 +276,21 @@ public void testBuildFromPrivateRegistry() throws Exception { LOG.info("Image Inspect: {}", inspectImageResponse.toString()); } + + @Test + 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/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