Skip to content

Commit 15cb3ac

Browse files
committed
Merge pull request docker-java#578 from docker-java/issue-551
Fix issue docker-java#551 for master branch
2 parents 1f85b7d + 28e11ed commit 15cb3ac

File tree

7 files changed

+46
-15
lines changed

7 files changed

+46
-15
lines changed

src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,7 @@ public BuildImageCmdImpl withDockerfile(File dockerfile) {
272272
this.dockerFile = dockerfile;
273273

274274
try {
275-
withTarInputStream(new Dockerfile(dockerfile).parse().buildDockerFolderTar(baseDirectory));
275+
withTarInputStream(new Dockerfile(dockerfile, baseDirectory).parse().buildDockerFolderTar());
276276
} catch (IOException e) {
277277
// we just created the file this should never happen.
278278
throw new RuntimeException(e);

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

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,9 @@ public class Dockerfile {
3131

3232
public final File dockerFile;
3333

34-
public Dockerfile(File dockerFile) {
34+
private final File baseDirectory;
3535

36+
public Dockerfile(File dockerFile, File baseDirectory) {
3637
if (!dockerFile.exists()) {
3738
throw new IllegalStateException(String.format("Dockerfile %s does not exist", dockerFile.getAbsolutePath()));
3839
}
@@ -43,6 +44,15 @@ public Dockerfile(File dockerFile) {
4344

4445
this.dockerFile = dockerFile;
4546

47+
if (!baseDirectory.exists()) {
48+
throw new IllegalStateException(String.format("Base directory %s does not exist", baseDirectory.getAbsolutePath()));
49+
}
50+
51+
if (!baseDirectory.isDirectory()) {
52+
throw new IllegalStateException(String.format("Base directory %s is not a directory", baseDirectory.getAbsolutePath()));
53+
}
54+
55+
this.baseDirectory = baseDirectory;
4656
}
4757

4858
private static class LineTransformer implements Function<String, Optional<? extends DockerfileStatement>> {
@@ -76,7 +86,7 @@ public Iterable<DockerfileStatement> getStatements() throws IOException {
7686

7787
public List<String> getIgnores() throws IOException {
7888
List<String> ignores = new ArrayList<String>();
79-
File dockerIgnoreFile = new File(getDockerFolder(), ".dockerignore");
89+
File dockerIgnoreFile = new File(baseDirectory, ".dockerignore");
8090
if (dockerIgnoreFile.exists()) {
8191
int lineNumber = 0;
8292
List<String> dockerIgnoreFileContent = FileUtils.readLines(dockerIgnoreFile);
@@ -102,10 +112,6 @@ public ScannedResult parse() throws IOException {
102112
return new ScannedResult();
103113
}
104114

105-
public File getDockerFolder() {
106-
return dockerFile.getParentFile();
107-
}
108-
109115
/**
110116
* Result of scanning / parsing a docker file.
111117
*/
@@ -116,7 +122,7 @@ public class ScannedResult {
116122
final List<File> filesToAdd = new ArrayList<File>();
117123

118124
public InputStream buildDockerFolderTar() {
119-
return buildDockerFolderTar(getDockerFolder());
125+
return buildDockerFolderTar(baseDirectory);
120126
}
121127

122128
public InputStream buildDockerFolderTar(File directory) {
@@ -180,7 +186,7 @@ public ScannedResult() throws IOException {
180186
"Dockerfile is excluded by pattern '%s' in .dockerignore file", matchingIgnorePattern));
181187
}
182188

183-
Collection<File> filesInBuildContext = FileUtils.listFiles(getDockerFolder(), TrueFileFilter.INSTANCE,
189+
Collection<File> filesInBuildContext = FileUtils.listFiles(baseDirectory, TrueFileFilter.INSTANCE,
184190
TrueFileFilter.INSTANCE);
185191

186192
for (File f : filesInBuildContext) {
@@ -217,7 +223,7 @@ private List<String> matchingIgnorePatterns(String fileName) {
217223
* will be respected.
218224
*/
219225
private String effectiveMatchingIgnorePattern(File file) {
220-
String relativeFilename = FilePathUtil.relativize(getDockerFolder(), file);
226+
String relativeFilename = FilePathUtil.relativize(baseDirectory, file);
221227

222228
List<String> matchingPattern = matchingIgnorePatterns(relativeFilename);
223229

@@ -242,6 +248,6 @@ private String effectiveMatchingIgnorePattern(File file) {
242248
}
243249

244250
return lastMatchingPattern;
245-
}
251+
}
246252
}
247253
}

src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,15 @@
2424
import org.testng.annotations.BeforeTest;
2525
import org.testng.annotations.Test;
2626

27-
import com.github.dockerjava.api.exception.DockerClientException;
2827
import com.github.dockerjava.api.command.BuildImageCmd;
2928
import com.github.dockerjava.api.command.CreateContainerResponse;
3029
import com.github.dockerjava.api.command.InspectContainerResponse;
3130
import com.github.dockerjava.api.command.InspectImageResponse;
31+
import com.github.dockerjava.api.exception.DockerClientException;
3232
import com.github.dockerjava.api.model.AuthConfig;
3333
import com.github.dockerjava.api.model.AuthConfigurations;
3434
import com.github.dockerjava.api.model.ExposedPort;
3535
import com.github.dockerjava.api.model.PortBinding;
36-
import com.github.dockerjava.api.model.Ports;
3736
import com.github.dockerjava.api.model.Ports.Binding;
3837
import com.github.dockerjava.client.AbstractDockerClientTest;
3938
import com.github.dockerjava.core.util.CompressArchiveUtil;
@@ -319,4 +318,20 @@ public void testBuildArgs() throws Exception {
319318

320319
assertThat(inspectImageResponse.getConfig().getLabels().get("test"), equalTo("abc"));
321320
}
321+
322+
public void testDockerfileNotInBaseDirectory() throws Exception {
323+
File baseDirectory = getResource("testDockerfileNotInBaseDirectory");
324+
File dockerfile = getResource("testDockerfileNotInBaseDirectory/dockerfileFolder/Dockerfile");
325+
BuildImageCmd command = dockerClient.buildImageCmd()
326+
.withBaseDirectory(baseDirectory)
327+
.withDockerfile(dockerfile);
328+
329+
String response = execBuild(command);
330+
331+
assertThat(response, containsString("Successfully executed testrun.sh"));
332+
}
333+
334+
private File getResource(String path) {
335+
return new File(Thread.currentThread().getContextClassLoader().getResource(path).getFile());
336+
}
322337
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public String apply(File file) {
2929
public void testAddMultipleFiles() throws IOException {
3030
File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("testAddMultipleFiles")
3131
.getFile());
32-
Dockerfile dockerfile = new Dockerfile(new File(baseDir, "Dockerfile"));
32+
Dockerfile dockerfile = new Dockerfile(new File(baseDir, "Dockerfile"), baseDir);
3333
Dockerfile.ScannedResult result = dockerfile.parse();
3434
Collection<String> filesToAdd = transform(result.filesToAdd, TO_FILE_NAMES);
3535

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public void testAllItems() throws IOException {
2626

2727
for (File child : root.listFiles()) {
2828
if (new File(child, "Dockerfile").exists()) {
29-
Dockerfile dockerfile = new Dockerfile(new File(child, "Dockerfile"));
29+
Dockerfile dockerfile = new Dockerfile(new File(child, "Dockerfile"), baseDir);
3030
dockerfiles.put(child.getName(), dockerfile);
3131
}
3232
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
FROM ubuntu:latest
2+
3+
ADD testrunFolder/testrun.sh /tmp/
4+
5+
RUN cp /tmp/testrun.sh /usr/local/bin/ && chmod +x /usr/local/bin/testrun.sh
6+
7+
CMD ["testrun.sh"]
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
#!/bin/sh
2+
3+
echo "Successfully executed testrun.sh"

0 commit comments

Comments
 (0)