Skip to content

Commit 9be43bc

Browse files
committed
Added importImage to support creating images from tar files
1 parent 1dd37ad commit 9be43bc

File tree

4 files changed

+71
-0
lines changed

4 files changed

+71
-0
lines changed

src/main/java/com/kpelykh/docker/client/DockerClient.java

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import javax.ws.rs.core.MultivaluedMap;
3131
import java.io.File;
3232
import java.io.IOException;
33+
import java.io.InputStream;
3334
import java.util.List;
3435
import java.util.UUID;
3536

@@ -150,6 +151,39 @@ public ClientResponse pull(String repository, String tag, String registry) throw
150151
}
151152
}
152153

154+
/**
155+
* Create an image by importing the given stream of a tar file.
156+
*
157+
* @param repository the repository to import to
158+
* @param tag any tag for this image
159+
* @param imageStream the InputStream of the tar file
160+
* @return an {@link ImageCreateResponse} containing the id of the imported image
161+
* @throws DockerException if the import fails for some reason.
162+
*/
163+
public ImageCreateResponse importImage(String repository, String tag, InputStream imageStream) throws DockerException {
164+
Preconditions.checkNotNull(repository, "Repository was not specified");
165+
Preconditions.checkNotNull(imageStream, "imageStream was not provided");
166+
167+
MultivaluedMap<String,String> params = new MultivaluedMapImpl();
168+
params.add("repo", repository);
169+
params.add("tag", tag);
170+
params.add("fromSrc","-");
171+
172+
WebResource webResource = client.resource(restEndpointUrl + "/images/create").queryParams(params);
173+
174+
try {
175+
LOGGER.trace("POST: {}", webResource);
176+
return webResource.accept(MediaType.APPLICATION_OCTET_STREAM_TYPE).post(ImageCreateResponse.class,imageStream);
177+
178+
} catch (UniformInterfaceException exception) {
179+
if (exception.getResponse().getStatus() == 500) {
180+
throw new DockerException("Server error.", exception);
181+
} else {
182+
throw new DockerException(exception);
183+
}
184+
}
185+
}
186+
153187
public List<SearchItem> search(String search) throws DockerException {
154188
WebResource webResource = client.resource(restEndpointUrl + "/images/search").queryParam("term", search);
155189
try {
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.kpelykh.docker.client.model;
2+
3+
import org.codehaus.jackson.annotate.JsonProperty;
4+
5+
import java.util.Arrays;
6+
7+
/**
8+
* Parse reponses from /images/create
9+
*
10+
* @author Ryan Campbell (ryan.campbell@gmail.com)
11+
*
12+
*/
13+
public class ImageCreateResponse {
14+
15+
@JsonProperty("status")
16+
private String id;
17+
18+
19+
public String getId() {
20+
return id;
21+
}
22+
23+
24+
@Override
25+
public String toString() {
26+
return "ContainerCreateResponse{" +
27+
"id='" + id + '\'' +
28+
'}';
29+
}
30+
}

src/test/java/com/kpelykh/docker/client/test/DockerClientTest.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -629,6 +629,13 @@ public void testDockerBuilderAddFolder() throws DockerException, IOException {
629629
dockerfileBuild(baseDir, "Successfully executed testAddFolder.sh");
630630
}
631631

632+
@Test
633+
public void testImportImageFromTar() throws DockerException, IOException {
634+
InputStream tar = Thread.currentThread().getContextClassLoader().getResourceAsStream("testImportImageFromTar/empty.tar");
635+
String imageId = dockerClient.importImage("empty", null, tar).getId();
636+
assert imageId.contains(dockerClient.inspectImage("empty").getId());
637+
}
638+
632639
@Test
633640
public void testNetCatDockerfileBuilder() throws DockerException, IOException, InterruptedException {
634641
File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("netcat").getFile());
10 KB
Binary file not shown.

0 commit comments

Comments
 (0)