Skip to content

Commit 2bf3f82

Browse files
committed
Merge pull request #9 from ydubreuil/build-from-tarstream
Add a build command accepting a tar as a InputStream, so we can build the Dockerfile TAR on the fly without a temporary folder.
2 parents 51075a4 + e6f13f8 commit 2bf3f82

File tree

2 files changed

+51
-28
lines changed

2 files changed

+51
-28
lines changed

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import org.apache.http.impl.conn.PoolingClientConnectionManager;
2020

2121
import com.github.dockerjava.client.command.AbstrDockerCmd;
22+
import com.github.dockerjava.client.command.AttachContainerCmd;
2223
import com.github.dockerjava.client.command.AuthCmd;
2324
import com.github.dockerjava.client.command.BuildImgCmd;
2425
import com.github.dockerjava.client.command.CommitCmd;
@@ -32,7 +33,6 @@
3233
import com.github.dockerjava.client.command.KillContainerCmd;
3334
import com.github.dockerjava.client.command.ListContainersCmd;
3435
import com.github.dockerjava.client.command.ListImagesCmd;
35-
import com.github.dockerjava.client.command.AttachContainerCmd;
3636
import com.github.dockerjava.client.command.LogContainerCmd;
3737
import com.github.dockerjava.client.command.PullImageCmd;
3838
import com.github.dockerjava.client.command.PushImageCmd;
@@ -326,6 +326,10 @@ public BuildImgCmd buildImageCmd(File dockerFolder) {
326326
return new BuildImgCmd(dockerFolder).withBaseResource(baseResource);
327327
}
328328

329+
public BuildImgCmd buildImageCmd(InputStream tarInputStream) {
330+
return new BuildImgCmd(tarInputStream).withBaseResource(baseResource);
331+
}
332+
329333
public TopContainerCmd topContainerCmd(String containerId) {
330334
return new TopContainerCmd(containerId).withBaseResource(baseResource);
331335
}

src/main/java/com/github/dockerjava/client/command/BuildImgCmd.java

Lines changed: 46 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import java.io.File;
44
import java.io.IOException;
5+
import java.io.InputStream;
56
import java.net.URI;
67
import java.net.URISyntaxException;
78
import java.util.ArrayList;
@@ -33,7 +34,8 @@ public class BuildImgCmd extends AbstrDockerCmd<BuildImgCmd, ClientResponse> {
3334

3435
private static final Logger LOGGER = LoggerFactory.getLogger(BuildImgCmd.class);
3536

36-
private File dockerFolder;
37+
private File dockerFolder = null;
38+
private InputStream tarInputStream = null;
3739
private String tag;
3840
private boolean noCache;
3941

@@ -43,6 +45,11 @@ public BuildImgCmd(File dockerFolder) {
4345
this.dockerFolder = dockerFolder;
4446
}
4547

48+
public BuildImgCmd(InputStream tarInputStream) {
49+
Preconditions.checkNotNull(tarInputStream, "tarInputStream is null");
50+
this.tarInputStream = tarInputStream;
51+
}
52+
4653
public BuildImgCmd withTag(String tag) {
4754
Preconditions.checkNotNull(tag, "Tag is null");
4855
this.tag = tag;
@@ -55,17 +62,49 @@ public BuildImgCmd withNoCache(boolean noCache) {
5562
}
5663

5764
protected ClientResponse impl() {
58-
59-
Preconditions.checkArgument(dockerFolder.exists(), "Path %s doesn't exist", dockerFolder);
60-
Preconditions.checkArgument(dockerFolder.isDirectory(), "Folder %s doesn't exist", dockerFolder);
61-
Preconditions.checkState(new File(dockerFolder, "Dockerfile").exists(), "Dockerfile doesn't exist in " + dockerFolder);
62-
65+
if (tarInputStream == null) {
66+
File dockerFolderTar = buildDockerFolderTar();
67+
try {
68+
return callDocker(FileUtils.openInputStream(dockerFolderTar));
69+
} catch (IOException e) {
70+
throw new DockerException(e);
71+
} finally {
72+
FileUtils.deleteQuietly(dockerFolderTar);
73+
}
74+
} else {
75+
return callDocker(tarInputStream);
76+
}
77+
}
78+
79+
protected ClientResponse callDocker(final InputStream dockerFolderTarInputStream) {
6380
MultivaluedMap<String, String> params = new MultivaluedMapImpl();
6481
params.add("t", tag);
6582
if (noCache) {
6683
params.add("nocache", "true");
6784
}
6885

86+
WebResource webResource = baseResource.path("/build").queryParams(params);
87+
88+
try {
89+
LOGGER.trace("POST: {}", webResource);
90+
return webResource
91+
.type("application/tar")
92+
.accept(MediaType.TEXT_PLAIN)
93+
.post(ClientResponse.class, dockerFolderTarInputStream);
94+
} catch (UniformInterfaceException exception) {
95+
if (exception.getResponse().getStatus() == 500) {
96+
throw new DockerException("Server error", exception);
97+
} else {
98+
throw new DockerException(exception);
99+
}
100+
}
101+
}
102+
103+
protected File buildDockerFolderTar() {
104+
Preconditions.checkArgument(dockerFolder.exists(), "Path %s doesn't exist", dockerFolder);
105+
Preconditions.checkArgument(dockerFolder.isDirectory(), "Folder %s doesn't exist", dockerFolder);
106+
Preconditions.checkState(new File(dockerFolder, "Dockerfile").exists(), "Dockerfile doesn't exist in " + dockerFolder);
107+
69108
// ARCHIVE TAR
70109
String archiveNameWithOutExtension = UUID.randomUUID().toString();
71110

@@ -112,31 +151,11 @@ protected ClientResponse impl() {
112151
}
113152

114153
dockerFolderTar = CompressArchiveUtil.archiveTARFiles(dockerFolder, filesToAdd, archiveNameWithOutExtension);
115-
154+
return dockerFolderTar;
116155
} catch (IOException ex) {
117156
FileUtils.deleteQuietly(dockerFolderTar);
118157
throw new DockerException("Error occurred while preparing Docker context folder.", ex);
119158
}
120-
121-
WebResource webResource = baseResource.path("/build").queryParams(params);
122-
123-
try {
124-
LOGGER.trace("POST: {}", webResource);
125-
return webResource
126-
.type("application/tar")
127-
.accept(MediaType.TEXT_PLAIN)
128-
.post(ClientResponse.class, FileUtils.openInputStream(dockerFolderTar));
129-
} catch (UniformInterfaceException exception) {
130-
if (exception.getResponse().getStatus() == 500) {
131-
throw new DockerException("Server error", exception);
132-
} else {
133-
throw new DockerException(exception);
134-
}
135-
} catch (IOException e) {
136-
throw new DockerException(e);
137-
} finally {
138-
FileUtils.deleteQuietly(dockerFolderTar);
139-
}
140159
}
141160

142161
private static boolean isFileResource(String resource) {

0 commit comments

Comments
 (0)