Skip to content

Commit a9c478b

Browse files
committed
Dockerfiles not called 'dockerfile'
Pass the name of the Dockerfile to docker. Adjust the TAR file to build from the correct path Implement some tests to show it working with a nonstandard name. Signed-off-by: Nigel Magnay <nigel.magnay@gmail.com>
1 parent 7f68a26 commit a9c478b

8 files changed

Lines changed: 96 additions & 10 deletions

File tree

src/main/java/com/github/dockerjava/api/DockerClient.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,9 @@ public CopyFileFromContainerCmd copyFileFromContainerCmd(
9898

9999
public CommitCmd commitCmd(String containerId);
100100

101-
public BuildImageCmd buildImageCmd(File dockerFolder);
101+
public BuildImageCmd buildImageCmd();
102+
103+
public BuildImageCmd buildImageCmd(File dockerFileOrFolder);
102104

103105
public BuildImageCmd buildImageCmd(InputStream tarInputStream);
104106

src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,12 @@ public interface BuildImageCmd extends DockerCmd<BuildImageCmd.Response>{
2828

2929
public boolean isQuiet();
3030

31+
public String getPathToDockerfile();
32+
3133
public AuthConfigurations getBuildAuthConfigs();
32-
34+
35+
public BuildImageCmd withBaseDirectory(File baseDirectory);
36+
3337
public BuildImageCmd withDockerfile(File dockerfile);
3438

3539
public BuildImageCmd withTarInputStream(InputStream tarInputStream);

src/main/java/com/github/dockerjava/core/DockerClientImpl.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,12 @@ public CommitCmd commitCmd(String containerId) {
291291
.createCommitCmdExec(), containerId);
292292
}
293293

294+
@Override
295+
public BuildImageCmd buildImageCmd() {
296+
return new BuildImageCmdImpl(getDockerCmdExecFactory()
297+
.createBuildImageCmdExec());
298+
}
299+
294300
@Override
295301
public BuildImageCmd buildImageCmd(File dockerFileOrFolder) {
296302
return new BuildImageCmdImpl(getDockerCmdExecFactory()

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

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import com.github.dockerjava.api.command.BuildImageCmd;
1010
import com.github.dockerjava.api.model.AuthConfigurations;
1111
import com.github.dockerjava.core.dockerfile.Dockerfile;
12+
import com.google.common.base.Optional;
1213

1314
/**
1415
*
@@ -24,6 +25,8 @@ public class BuildImageCmdImpl extends AbstrDockerCmd<BuildImageCmd, BuildImageC
2425
private boolean remove = true;
2526
private boolean quiet;
2627
private AuthConfigurations buildAuthConfigs;
28+
private File dockerFile;
29+
private File baseDirectory;
2730

2831
public BuildImageCmdImpl(BuildImageCmd.Exec exec) {
2932
super(exec);
@@ -33,10 +36,13 @@ public BuildImageCmdImpl(BuildImageCmd.Exec exec, File dockerFileOrFolder) {
3336
super(exec);
3437
checkNotNull(dockerFileOrFolder, "dockerFolder is null");
3538

36-
if( dockerFileOrFolder.isDirectory() )
37-
withDockerfile( new File(dockerFileOrFolder, "Dockerfile"));
38-
else
39-
withDockerfile( dockerFileOrFolder);
39+
if( dockerFileOrFolder.isDirectory() ) {
40+
withBaseDirectory(dockerFileOrFolder);
41+
withDockerfile(new File(dockerFileOrFolder, "Dockerfile"));
42+
}
43+
else {
44+
withDockerfile(dockerFileOrFolder);
45+
}
4046
}
4147

4248
public BuildImageCmdImpl(BuildImageCmd.Exec exec, InputStream tarInputStream) {
@@ -55,12 +61,20 @@ public BuildImageCmdImpl withDockerfile(File dockerfile) {
5561
checkNotNull(dockerfile);
5662
if( !dockerfile.exists() )
5763
throw new IllegalArgumentException("Dockerfile does not exist");
64+
if( !dockerfile.isFile() )
65+
throw new IllegalArgumentException("Not a directory");
66+
67+
if( baseDirectory == null )
68+
withBaseDirectory(dockerfile.getParentFile());
69+
70+
71+
this.dockerFile = dockerfile;
5872

5973
try {
6074
withTarInputStream(
6175
new Dockerfile(dockerfile)
6276
.parse()
63-
.buildDockerFolderTar() );
77+
.buildDockerFolderTar(baseDirectory) );
6478
} catch (IOException e) {
6579
// we just created the file this should never happen.
6680
throw new RuntimeException(e);
@@ -102,12 +116,24 @@ public boolean isQuiet() {
102116
return quiet;
103117
}
104118

105-
@Override
119+
@Override
120+
public String getPathToDockerfile() {
121+
int baseLen = baseDirectory.getAbsolutePath().length();
122+
return dockerFile.getAbsolutePath().substring(baseLen+1);
123+
}
124+
125+
@Override
106126
public AuthConfigurations getBuildAuthConfigs() {
107127
return buildAuthConfigs;
108128
}
109129

110-
@Override
130+
@Override
131+
public BuildImageCmd withBaseDirectory(File baseDirectory) {
132+
this.baseDirectory = baseDirectory;
133+
return this;
134+
}
135+
136+
@Override
111137
public BuildImageCmdImpl withNoCache() {
112138
return withNoCache(true);
113139
}

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,14 +166,18 @@ public class ScannedResult {
166166
final List<File> filesToAdd = new ArrayList<File>();
167167

168168
public InputStream buildDockerFolderTar() {
169+
return buildDockerFolderTar(getDockerFolder());
170+
}
171+
172+
public InputStream buildDockerFolderTar(File directory) {
169173

170174
// ARCHIVE TAR
171175
File dockerFolderTar = null;
172176

173177
try {
174178
String archiveNameWithOutExtension = UUID.randomUUID().toString();
175179

176-
dockerFolderTar = CompressArchiveUtil.archiveTARFiles(getDockerFolder(),
180+
dockerFolderTar = CompressArchiveUtil.archiveTARFiles(directory,
177181
filesToAdd,
178182
archiveNameWithOutExtension);
179183
return FileUtils.openInputStream(dockerFolderTar);

src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ public BuildImageCmdExec(WebTarget baseResource) {
3535
@Override
3636
protected ResponseImpl execute(BuildImageCmd command) {
3737
WebTarget webResource = getBaseResource().path("/build");
38+
String dockerFilePath = command.getPathToDockerfile();
3839

3940
if(command.getTag() != null) {
4041
webResource = webResource.queryParam("t", command.getTag());
@@ -48,6 +49,9 @@ protected ResponseImpl execute(BuildImageCmd command) {
4849
if (command.isQuiet()) {
4950
webResource = webResource.queryParam("q", "true");
5051
}
52+
if( dockerFilePath != null && !"Dockerfile".equals(dockerFilePath)) {
53+
webResource = webResource.queryParam("dockerfile", dockerFilePath);
54+
}
5155

5256

5357
webResource.property(ClientProperties.REQUEST_ENTITY_PROCESSING, RequestEntityProcessing.CHUNKED);

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

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,34 @@ public void testNginxDockerfileBuilder() {
7676
equalTo("Guillaume J. Charmes \"guillaume@dotcloud.com\""));
7777
}
7878

79+
@Test
80+
public void testNonstandard1() {
81+
File baseDir = new File(Thread.currentThread().getContextClassLoader()
82+
.getResource("nonstandard/subdirectory/Dockerfile-nonstandard").getFile());
83+
84+
InputStream response = dockerClient.buildImageCmd(baseDir).withNoCache().exec();
85+
86+
String fullLog = asString(response);
87+
assertThat(fullLog, containsString("Successfully built"));
88+
}
89+
90+
@Test
91+
public void testNonstandard2() {
92+
File baseDir = new File(Thread.currentThread().getContextClassLoader()
93+
.getResource("nonstandard").getFile());
94+
File dockerFile = new File(Thread.currentThread().getContextClassLoader()
95+
.getResource("nonstandard/subdirectory/Dockerfile-nonstandard").getFile());
96+
97+
98+
InputStream response = dockerClient.buildImageCmd()
99+
.withBaseDirectory(baseDir)
100+
.withDockerfile(dockerFile)
101+
.withNoCache().exec();
102+
103+
String fullLog = asString(response);
104+
assertThat(fullLog, containsString("Successfully built"));
105+
}
106+
79107
@Test
80108
public void testDockerBuilderAddUrl() {
81109
File baseDir = new File(Thread.currentThread().getContextClassLoader()
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
# Nginx
2+
#
3+
# VERSION 0.0.1
4+
5+
FROM ubuntu:latest
6+
MAINTAINER Guillaume J. Charmes "guillaume@dotcloud.com"
7+
8+
# make sure the package repository is up to date
9+
RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list
10+
RUN apt-get update
11+
12+
RUN apt-get install -y inotify-tools nginx apache2 openssh-server

0 commit comments

Comments
 (0)