Skip to content

Commit efe372c

Browse files
author
Sean Fitts
committed
Merge remote-tracking branch 'upstream/master'
2 parents 5eb8342 + 9e79aa6 commit efe372c

27 files changed

+681
-257
lines changed

README.md

Lines changed: 3 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -46,66 +46,14 @@ Run build with tests:
4646
<dependency>
4747
<groupId>com.github.docker-java</groupId>
4848
<artifactId>docker-java</artifactId>
49-
<version>0.9.0-SNAPSHOT</version>
49+
<version>0.9.0</version>
5050
</dependency>
5151

5252
Latest SNAPSHOT is available from maven repo: https://oss.sonatype.org/content/groups/public
5353

54-
## Example code snippets:
54+
## Documentation
5555

56-
DockerClient dockerClient = new DockerClient("http://localhost:2375");
57-
58-
###### Get Docker info:
59-
60-
Info info = dockerClient.infoCmd().exec();
61-
System.out.print(info);
62-
63-
###### Search Docker repository:
64-
65-
List<SearchItem> dockerSearch = dockerClient.searchImagesCmd("busybox").exec();
66-
System.out.println("Search returned" + dockerSearch.toString());
67-
68-
###### Create new Docker container, wait for its start and stop it:
69-
70-
ContainerCreateResponse container = dockerClient.createContainerCmd("busybox").withCmd("touch", "/test").exec();
71-
72-
dockerClient.startContainerCmd(container.id).exec();
73-
74-
dockerClient.waitContainerCmd(container.id).exec();
75-
76-
dockerClient.stopContainerCmd(container.id).exec();
77-
78-
79-
##### Support for UNIX sockets:
80-
81-
Support for UNIX socket should appear in docker-java pretty soon. I'm working on its integration.
82-
83-
##### Docker Builder:
84-
85-
To use Docker Builder, as described on page http://docs.docker.io/en/latest/use/builder/,
86-
user dockerClient.buildImageCmd(baseDir), where baseDir is a path to folder containing Dockerfile.
87-
88-
89-
File baseDir = new File("~/kpelykh/docker/netcat");
90-
91-
ClientResponse response = dockerClient.buildImageCmd(baseDir).exec();
92-
93-
StringWriter logwriter = new StringWriter();
94-
95-
try {
96-
LineIterator itr = IOUtils.lineIterator(response.getEntityInputStream(), "UTF-8");
97-
while (itr.hasNext()) {
98-
String line = itr.next();
99-
logwriter.write(line);
100-
LOG.info(line);
101-
}
102-
} finally {
103-
IOUtils.closeQuietly(response.getEntityInputStream());
104-
}
105-
106-
107-
108-
For additional examples, please look at [Test cases](https://github.com/docker-java/docker-java/tree/master/src/test/java/com/github/dockerjava/client/command "Test cases")
56+
For code examples, please look at the [Wiki](https://github.com/docker-java/docker-java/wiki) or [Test cases](https://github.com/docker-java/docker-java/tree/master/src/test/java/com/github/dockerjava/client/command "Test cases")
10957

11058
## Configuration
11159

pom.xml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
2-
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
1+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
32
<modelVersion>4.0.0</modelVersion>
43

54
<parent>
@@ -11,7 +10,7 @@
1110
<groupId>com.github.docker-java</groupId>
1211
<artifactId>docker-java</artifactId>
1312
<packaging>jar</packaging>
14-
<version>0.9.0-SNAPSHOT</version>
13+
<version>0.9.1-SNAPSHOT</version>
1514

1615
<name>docker-java</name>
1716
<url>https://github.com/docker-java/docker-java</url>

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

Lines changed: 19 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -67,26 +67,30 @@ public class DockerClient {
6767
private AuthConfig authConfig;
6868

6969
public DockerClient() throws DockerException {
70-
this(Config.createConfig());
70+
this(10000, true);
71+
}
72+
public DockerClient(Integer readTimeout, boolean enableLoggingFilter) throws DockerException {
73+
this(Config.createConfig(), readTimeout, enableLoggingFilter);
7174
}
7275

7376
public DockerClient(String serverUrl) throws DockerException {
74-
this(configWithServerUrl(serverUrl));
77+
this(serverUrl, 10000, true);
7578
}
7679

80+
public DockerClient(String serverUrl, Integer readTimeout, boolean enableLoggingFilter) throws DockerException {
81+
this(configWithServerUrl(serverUrl), readTimeout, enableLoggingFilter);
82+
}
83+
7784
private static Config configWithServerUrl(String serverUrl)
7885
throws DockerException {
7986
final Config c = Config.createConfig();
8087
c.url = URI.create(serverUrl);
8188
return c;
8289
}
8390

84-
private DockerClient(Config config) {
85-
// restEndpointUrl = config.url + "/v" + config.version;
91+
public DockerClient(Config config, Integer readTimeout, boolean enableLoggingFilter) {
8692
ClientConfig clientConfig = new DefaultClientConfig();
87-
// clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING,
88-
// Boolean.TRUE);
89-
93+
9094
SchemeRegistry schemeRegistry = new SchemeRegistry();
9195
schemeRegistry.register(new Scheme("http", config.url.getPort(),
9296
PlainSocketFactory.getSocketFactory()));
@@ -104,16 +108,19 @@ private DockerClient(Config config) {
104108
client = new ApacheHttpClient4(new ApacheHttpClient4Handler(httpClient,
105109
null, false), clientConfig);
106110

107-
client.setReadTimeout(10000);
108-
// Experimental support for unix sockets:
109-
// client = new UnixSocketClient(clientConfig);
110-
111+
// 1 hour
112+
client.setReadTimeout(readTimeout);
113+
111114
client.addFilter(new JsonClientFilter());
112-
client.addFilter(new SelectiveLoggingFilter());
115+
116+
if (enableLoggingFilter)
117+
client.addFilter(new SelectiveLoggingFilter());
113118

114119
baseResource = client.resource(config.url + "/v" + config.version);
115120
}
116121

122+
123+
117124
public void setCredentials(String username, String password, String email) {
118125
if (username == null) {
119126
throw new IllegalArgumentException("username is null");
@@ -201,54 +208,22 @@ public ImportImageCmd importImageCmd(String repository,
201208
.withBaseResource(baseResource);
202209
}
203210

204-
// public ImageCreateResponse importImage(String repository,
205-
// InputStream imageStream) {
206-
// return execute(importImageCmd(repository, imageStream));
207-
// }
208-
209211
public SearchImagesCmd searchImagesCmd(String term) {
210212
return new SearchImagesCmd(term).withBaseResource(baseResource);
211213
}
212214

213-
// public List<SearchItem> searchImages(String term) {
214-
// return execute(searchImagesCmd(term));
215-
// }
216-
217215
public RemoveImageCmd removeImageCmd(String imageId) {
218216
return new RemoveImageCmd(imageId).withBaseResource(baseResource);
219217
}
220218

221-
// /**
222-
// * Remove an image, deleting any tags it might have.
223-
// */
224-
// public void removeImage(String imageId) {
225-
// execute(removeImageCmd(imageId));
226-
// }
227-
//
228-
// public void removeImages(List<String> images) {
229-
// Preconditions.checkNotNull(images, "List of images can't be null");
230-
//
231-
// for (String imageId : images) {
232-
// removeImage(imageId);
233-
// }
234-
// }
235-
236219
public ListImagesCmd listImagesCmd() {
237220
return new ListImagesCmd().withBaseResource(baseResource);
238221
}
239222

240-
// public List<Image> listImages() {
241-
// return execute(listImagesCmd());
242-
// }
243-
244223
public InspectImageCmd inspectImageCmd(String imageId) {
245224
return new InspectImageCmd(imageId).withBaseResource(baseResource);
246225
}
247226

248-
// public ImageInspectResponse inspectImage(String imageId) {
249-
// return execute(inspectImageCmd(imageId));
250-
// }
251-
252227
/**
253228
* * CONTAINER API *
254229
*/
@@ -257,10 +232,6 @@ public ListContainersCmd listContainersCmd() {
257232
return new ListContainersCmd().withBaseResource(baseResource);
258233
}
259234

260-
// public List<Container> listContainers() {
261-
// return execute(listContainersCmd());
262-
// }
263-
264235
public CreateContainerCmd createContainerCmd(String image) {
265236
return new CreateContainerCmd(new CreateContainerConfig()).withImage(
266237
image).withBaseResource(baseResource);

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

Lines changed: 66 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,17 @@
66
import java.net.URI;
77
import java.net.URISyntaxException;
88
import java.util.ArrayList;
9+
import java.util.HashMap;
910
import java.util.List;
11+
import java.util.Map;
1012
import java.util.UUID;
13+
import java.util.regex.Matcher;
14+
import java.util.regex.Pattern;
1115

1216
import javax.ws.rs.core.MediaType;
1317
import javax.ws.rs.core.MultivaluedMap;
1418

1519
import org.apache.commons.io.FileUtils;
16-
import org.apache.commons.lang.StringUtils;
1720
import org.slf4j.Logger;
1821
import org.slf4j.LoggerFactory;
1922

@@ -34,6 +37,10 @@ public class BuildImgCmd extends AbstrDockerCmd<BuildImgCmd, ClientResponse> {
3437

3538
private static final Logger LOGGER = LoggerFactory.getLogger(BuildImgCmd.class);
3639

40+
private static final Pattern ADD_OR_COPY_PATTERN = Pattern.compile("^(ADD|COPY)\\s+(.*)\\s+(.*)$");
41+
42+
private static final Pattern ENV_PATTERN = Pattern.compile("^ENV\\s+(.*)\\s+(.*)$");
43+
3744
private File dockerFolder = null;
3845
private InputStream tarInputStream = null;
3946
private String tag;
@@ -150,14 +157,40 @@ protected File buildDockerFolderTar() {
150157
List<File> filesToAdd = new ArrayList<File>();
151158
filesToAdd.add(dockerFile);
152159

160+
Map<String, String>environmentMap = new HashMap<String, String>();
161+
162+
int lineNumber = 0;
163+
153164
for (String cmd : dockerFileContent) {
154-
if (StringUtils.startsWithIgnoreCase(cmd.trim(), "ADD")) {
155-
String addArgs[] = StringUtils.split(cmd, " \t");
156-
if (addArgs.length != 3) {
157-
throw new DockerException(String.format("Wrong format on line [%s]", cmd));
165+
166+
lineNumber++;
167+
168+
if (cmd.trim().isEmpty() || cmd.startsWith("#"))
169+
continue; // skip emtpy and commend lines
170+
171+
final Matcher envMatcher = ENV_PATTERN.matcher(cmd.trim());
172+
173+
if (envMatcher.find()) {
174+
if (envMatcher.groupCount() != 2)
175+
throw new DockerException(String.format("Wrong ENV format on line [%d]", lineNumber));
176+
177+
String variable = envMatcher.group(1).trim();
178+
179+
String value = envMatcher.group(2).trim();
180+
181+
environmentMap.put(variable, value);
182+
}
183+
184+
185+
final Matcher matcher = ADD_OR_COPY_PATTERN.matcher(cmd.trim());
186+
if (matcher.find()) {
187+
if (matcher.groupCount() != 3) {
188+
throw new DockerException(String.format("Wrong ADD or COPY format on line [%d]", lineNumber));
158189
}
159190

160-
String resource = addArgs[1];
191+
String extractedResource = matcher.group(2);
192+
193+
String resource = filterForEnvironmentVars(extractedResource, environmentMap);
161194

162195
if(isFileResource(resource)) {
163196
File src = new File(resource);
@@ -187,6 +220,33 @@ protected File buildDockerFolderTar() {
187220
}
188221
}
189222

223+
private String filterForEnvironmentVars(String extractedResource,
224+
Map<String, String> environmentMap) {
225+
226+
if (environmentMap.size() > 0) {
227+
228+
String currentResourceContent = extractedResource;
229+
230+
for (Map.Entry<String, String> entry : environmentMap.entrySet()) {
231+
232+
String variable = entry.getKey();
233+
234+
String replacementValue = entry.getValue();
235+
236+
// handle: $VARIABLE case
237+
currentResourceContent = currentResourceContent.replaceAll("\\$" + variable, replacementValue);
238+
239+
// handle ${VARIABLE} case
240+
currentResourceContent = currentResourceContent.replaceAll("\\$\\{" + variable + "\\}", replacementValue);
241+
242+
}
243+
244+
return currentResourceContent;
245+
}
246+
else
247+
return extractedResource;
248+
}
249+
190250
private static boolean isFileResource(String resource) {
191251
URI uri;
192252
try {

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

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import com.github.dockerjava.client.model.ContainerCreateResponse;
1515
import com.github.dockerjava.client.model.CreateContainerConfig;
1616
import com.github.dockerjava.client.model.ExposedPort;
17+
import com.github.dockerjava.client.model.Volume;
1718
import com.google.common.base.Preconditions;
1819
import com.sun.jersey.api.client.UniformInterfaceException;
1920
import com.sun.jersey.api.client.WebResource;
@@ -55,15 +56,9 @@ public CreateContainerCmd withCmd(String... cmd) {
5556
return this;
5657
}
5758

58-
public CreateContainerCmd withVolumes(String... volumes) {
59+
public CreateContainerCmd withVolumes(Volume... volumes) {
5960
Preconditions.checkNotNull(volumes, "volumes was not specified");
60-
61-
Map<String,String> _volumes = new HashMap<String, String>();
62-
for(String volume:volumes) {
63-
_volumes.put(volume, "");
64-
}
65-
66-
this.containerCreateConfig.withVolumes(_volumes);
61+
this.containerCreateConfig.withVolumes(volumes);
6762
return this;
6863
}
6964

0 commit comments

Comments
 (0)