From 3fcf3d7267994fb2e76bc86da16939ee8543c2cb Mon Sep 17 00:00:00 2001 From: "alex.collins" Date: Sun, 18 May 2014 19:08:49 +0100 Subject: [PATCH 1/7] added support for a single centralized configuration --- .../com/kpelykh/docker/client/Config.java | 57 +++++++++++++++++++ .../kpelykh/docker/client/DockerClient.java | 55 ++++++++++++------ .../docker/client/model/ContainerConfig.java | 2 +- src/main/resources/docker.io.properties | 2 + .../client/test/AbstractDockerClientTest.java | 33 +++-------- .../client/test/DockerClientAuthTest.java | 26 ++++----- .../docker/client/test/DockerPushTest.java | 52 +++++++---------- 7 files changed, 136 insertions(+), 91 deletions(-) create mode 100644 src/main/java/com/kpelykh/docker/client/Config.java create mode 100644 src/main/resources/docker.io.properties diff --git a/src/main/java/com/kpelykh/docker/client/Config.java b/src/main/java/com/kpelykh/docker/client/Config.java new file mode 100644 index 00000000..e5ae6115 --- /dev/null +++ b/src/main/java/com/kpelykh/docker/client/Config.java @@ -0,0 +1,57 @@ +package com.kpelykh.docker.client; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.net.URI; +import java.util.Properties; + +class Config { + URI url; + String version, username, password, email; + + private Config() { + } + + static Config createConfig() throws DockerException { + final Properties p = new Properties(); + + try { + p.load(DockerClient.class.getResourceAsStream("/docker.io.properties")); + } catch (IOException e) { + throw new DockerException(e); + } + + for (String s : new String[]{"url", "version", "username", "password", "email"}) { + final String key = "docker.io." + s; + if (System.getProperties().keySet().contains(key)) { + p.setProperty(key, System.getProperty(key)); + } + } + + final File file = new File(System.getProperty("user.name"), ".docker.io.properties"); + System.out.println(file); + if (file.isFile()) { + try { + final FileInputStream in = new FileInputStream(file); + try { + p.load(in); + } finally { + in.close(); + } + } catch (IOException e) { + throw new DockerException(e); + } + } + + final Config c = new Config(); + + c.url = URI.create(p.getProperty("docker.io.url")); + c.version = p.getProperty("docker.io.version"); + c.username = p.getProperty("docker.io.username"); + c.password = p.getProperty("docker.io.password"); + c.email = p.getProperty("docker.io.email"); + + return c; + } +} diff --git a/src/main/java/com/kpelykh/docker/client/DockerClient.java b/src/main/java/com/kpelykh/docker/client/DockerClient.java index 1f606922..5f723b90 100644 --- a/src/main/java/com/kpelykh/docker/client/DockerClient.java +++ b/src/main/java/com/kpelykh/docker/client/DockerClient.java @@ -37,6 +37,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.StringWriter; +import java.net.URI; import java.util.ArrayList; import java.util.List; import java.util.UUID; @@ -50,22 +51,31 @@ public class DockerClient { private static final Logger LOGGER = LoggerFactory.getLogger(DockerClient.class); - private static DockerClient instance; - private Client client; + private Client client; private String restEndpointUrl; private AuthConfig authConfig; - public DockerClient() { - this("http://localhost:4243"); + public DockerClient() throws DockerException { + this(Config.createConfig()); } - public DockerClient(String serverUrl) { - restEndpointUrl = serverUrl + "/v1.11"; + public DockerClient(String serverUrl) throws DockerException { + this(configWithServerUrl(serverUrl)); + } + + private static Config configWithServerUrl(String serverUrl) throws DockerException { + final Config c = Config.createConfig(); + c.url = URI.create(serverUrl); + return c; + } + + private DockerClient(Config config) { + restEndpointUrl = config.url + "/v" + config.version; ClientConfig clientConfig = new DefaultClientConfig(); clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE); SchemeRegistry schemeRegistry = new SchemeRegistry(); - schemeRegistry.register(new Scheme("http", 4243, PlainSocketFactory.getSocketFactory())); + schemeRegistry.register(new Scheme("http", config.url.getPort(), PlainSocketFactory.getSocketFactory())); schemeRegistry.register(new Scheme("https", 443, SSLSocketFactory.getSocketFactory())); PoolingClientConnectionManager cm = new PoolingClientConnectionManager(schemeRegistry); @@ -105,7 +115,6 @@ public void setCredentials(String username, String password, String email) { * Authenticate with the server, useful for checking authentication. */ public void auth() throws DockerException { - checkAuthConfig(); try { client.resource(restEndpointUrl + "/auth") .header("Content-Type", MediaType.APPLICATION_JSON) @@ -124,18 +133,28 @@ private String registryAuth() throws DockerException { } } - private AuthConfig authConfig() throws DockerException { - checkAuthConfig(); - return authConfig; - } + public AuthConfig authConfig() throws DockerException { + return authConfig != null + ? authConfig + : authConfigFromProperties(); + } - private void checkAuthConfig() throws DockerException { - if (authConfig == null) { - throw new DockerException("authentication credentials required"); - } - } + private static AuthConfig authConfigFromProperties() throws DockerException { + final AuthConfig a = new AuthConfig(); - /** + a.setUsername(Config.createConfig().username); + a.setPassword(Config.createConfig().password); + a.setEmail(Config.createConfig().email); + + if (a.getUsername() == null) {throw new IllegalStateException("username is null");} + if (a.getPassword() == null) {throw new IllegalStateException("password is null");} + if (a.getEmail() == null) {throw new IllegalStateException("email is null");} + + return a; + } + + + /** * * MISC API * * */ diff --git a/src/main/java/com/kpelykh/docker/client/model/ContainerConfig.java b/src/main/java/com/kpelykh/docker/client/model/ContainerConfig.java index 5e9dbf7d..413020d2 100644 --- a/src/main/java/com/kpelykh/docker/client/model/ContainerConfig.java +++ b/src/main/java/com/kpelykh/docker/client/model/ContainerConfig.java @@ -285,7 +285,7 @@ public String toString() { ", privileged=" + privileged + ", workingDir='" + workingDir + '\'' + ", domainName='" + domainName + '\'' + - ", onBuild='" + onBuild + '\'' + + ", onBuild='" + Arrays.toString(onBuild) + '\'' + '}'; } } diff --git a/src/main/resources/docker.io.properties b/src/main/resources/docker.io.properties new file mode 100644 index 00000000..0ce162bd --- /dev/null +++ b/src/main/resources/docker.io.properties @@ -0,0 +1,2 @@ +docker.io.url=http://localhost:4243 +docker.io.version=1.11 \ No newline at end of file diff --git a/src/test/java/com/kpelykh/docker/client/test/AbstractDockerClientTest.java b/src/test/java/com/kpelykh/docker/client/test/AbstractDockerClientTest.java index eb9bcf73..be878f78 100644 --- a/src/test/java/com/kpelykh/docker/client/test/AbstractDockerClientTest.java +++ b/src/test/java/com/kpelykh/docker/client/test/AbstractDockerClientTest.java @@ -1,18 +1,17 @@ package com.kpelykh.docker.client.test; -import java.io.IOException; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.List; - +import com.kpelykh.docker.client.DockerClient; +import com.kpelykh.docker.client.DockerException; +import com.sun.jersey.api.client.ClientResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.testng.Assert; import org.testng.ITestResult; -import com.kpelykh.docker.client.DockerClient; -import com.kpelykh.docker.client.DockerException; -import com.sun.jersey.api.client.ClientResponse; +import java.io.IOException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; public abstract class AbstractDockerClientTest extends Assert { @@ -81,23 +80,5 @@ protected String logResponseStream(ClientResponse response) throws IOException { LOG.info("Container log: {}", responseString); return responseString; } - - private String getProperty(String name) { - String property = System.getProperty(name); - if(property == null || property.isEmpty()) throw new RuntimeException("Need to configure '" + name + "' property to run the test. Use command line option -D"+ name +"=... to do so."); - return property; - } - - protected String getUsername() { - return getProperty("docker.io.username"); - } - - protected String getPassword() { - return getProperty("docker.io.password"); - } - - protected String getEmail() { - return getProperty("docker.io.email"); - } } diff --git a/src/test/java/com/kpelykh/docker/client/test/DockerClientAuthTest.java b/src/test/java/com/kpelykh/docker/client/test/DockerClientAuthTest.java index 6fe6e999..30a33a0c 100644 --- a/src/test/java/com/kpelykh/docker/client/test/DockerClientAuthTest.java +++ b/src/test/java/com/kpelykh/docker/client/test/DockerClientAuthTest.java @@ -1,20 +1,14 @@ package com.kpelykh.docker.client.test; -import static org.hamcrest.MatcherAssert.assertThat; - -import java.lang.reflect.Method; -import java.util.ArrayList; - +import com.kpelykh.docker.client.DockerException; +import com.sun.jersey.api.client.UniformInterfaceException; import org.hamcrest.Matchers; import org.testng.ITestResult; -import org.testng.annotations.AfterMethod; -import org.testng.annotations.AfterTest; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.BeforeTest; -import org.testng.annotations.Test; +import org.testng.annotations.*; -import com.kpelykh.docker.client.DockerException; -import com.sun.jersey.api.client.UniformInterfaceException; +import java.lang.reflect.Method; + +import static org.hamcrest.MatcherAssert.assertThat; public class DockerClientAuthTest extends AbstractDockerClientTest { @@ -36,21 +30,21 @@ public void beforeMethod(Method method) { public void afterMethod(ITestResult result) { super.afterMethod(result); } - + @Test public void testAuth() throws Exception { - dockerClient.setCredentials(getUsername(), getPassword(), getEmail()); dockerClient.auth(); } @Test public void testAuthInvalid() throws Exception { - dockerClient.setCredentials(getUsername(), getPassword(), getEmail()); + System.setProperty("docker.io.password", "garbage"); try { dockerClient.auth(); + fail(); } catch (DockerException e) { assertThat(e.getCause(), Matchers.instanceOf(UniformInterfaceException.class)); - assertEquals(401, ((UniformInterfaceException) e.getCause()).getResponse().getStatus()); + assertEquals(((UniformInterfaceException) e.getCause()).getResponse().getStatus(), 401); } } } diff --git a/src/test/java/com/kpelykh/docker/client/test/DockerPushTest.java b/src/test/java/com/kpelykh/docker/client/test/DockerPushTest.java index b5709f96..7e6d88a9 100644 --- a/src/test/java/com/kpelykh/docker/client/test/DockerPushTest.java +++ b/src/test/java/com/kpelykh/docker/client/test/DockerPushTest.java @@ -1,27 +1,20 @@ package com.kpelykh.docker.client.test; -import static com.kpelykh.docker.client.DockerClient.asString; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.containsString; -import static org.hamcrest.Matchers.isEmptyString; -import static org.hamcrest.Matchers.not; - -import java.lang.reflect.Method; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.testng.ITestResult; -import org.testng.annotations.AfterMethod; -import org.testng.annotations.AfterTest; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.BeforeTest; -import org.testng.annotations.Test; - import com.kpelykh.docker.client.DockerException; import com.kpelykh.docker.client.model.CommitConfig; import com.kpelykh.docker.client.model.ContainerConfig; import com.kpelykh.docker.client.model.ContainerCreateResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.testng.ITestResult; +import org.testng.annotations.*; + +import java.lang.reflect.Method; + +import static com.kpelykh.docker.client.DockerClient.asString; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.*; // delete here : https://index.docker.io/u/alexec/busybox/delete/ public class DockerPushTest extends AbstractDockerClientTest { @@ -29,9 +22,12 @@ public class DockerPushTest extends AbstractDockerClientTest { public static final Logger LOG = LoggerFactory .getLogger(DockerPushTest.class); + String username; + @BeforeTest public void beforeTest() throws DockerException { super.beforeTest(); + username = dockerClient.authConfig().getUsername(); } @AfterTest public void afterTest() { @@ -47,10 +43,10 @@ public void beforeMethod(Method method) { public void afterMethod(ITestResult result) { super.afterMethod(result); } - + @Test public void testPushLatest() throws Exception { - setUpCredentials(); + ContainerConfig containerConfig = new ContainerConfig(); containerConfig.setImage("busybox"); @@ -67,26 +63,22 @@ public void testPushLatest() throws Exception { LOG.info("Commiting container: {}", container.toString()); CommitConfig commitConfig = new CommitConfig(container.getId()); - commitConfig.setRepo(getUsername() + "/busybox"); - - String imageId = dockerClient - .commit(commitConfig); + + commitConfig.setRepo(username + "/busybox"); - logResponseStream(dockerClient.push(getUsername() + "/busybox")); + String imageId = dockerClient.commit(commitConfig); + + logResponseStream(dockerClient.push(username + "/busybox")); dockerClient.removeImage(imageId); - assertThat(asString(dockerClient.pull(getUsername() + "/busybox")), not(containsString("404"))); + assertThat(asString(dockerClient.pull(username + "/busybox")), not(containsString("404"))); } @Test public void testNotExistentImage() throws Exception { - setUpCredentials(); - assertThat(logResponseStream(dockerClient.push(getUsername() + "/xxx")), containsString("error")); - } - private void setUpCredentials() { - dockerClient.setCredentials(getUsername(), getPassword(), getEmail()); + assertThat(logResponseStream(dockerClient.push(username + "/xxx")), containsString("error")); } From 9cf0799d1aa8c5de44aa7fe8b5336f5b494a9e64 Mon Sep 17 00:00:00 2001 From: "alex.collins" Date: Sun, 18 May 2014 21:52:26 +0100 Subject: [PATCH 2/7] README update --- README.md | 41 +++++++++++++++++-- .../com/kpelykh/docker/client/Config.java | 2 +- 2 files changed, 38 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 76075d2f..c3e292de 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ listening on TCP port. To allow Docker server to use TCP add the following line More details setting up docket server can be found in official documentation: http://docs.docker.io/en/latest/use/basics/ Now make sure that docker is up: - + $ docker -H tcp://127.0.0.1:4243 version Client version: 0.8.1 @@ -63,12 +63,12 @@ Run build with tests: Info info = dockerClient.info(); System.out.print(info); - + ###### Search Docker repository: List dockerSearch = dockerClient.search("busybox"); System.out.println("Search returned" + dockerSearch.toString()); - + ###### Create new Docker container, wait for its start and stop it: ContainerConfig containerConfig = new ContainerConfig(); @@ -81,7 +81,7 @@ Run build with tests: dockerClient.waitContainer(container.id); dockerClient.stopContainer(container.id); - + ##### Support for UNIX sockets: @@ -114,3 +114,36 @@ user dockerClient.build(baseDir), where baseDir is a path to folder containing D For additional examples, please look at [DockerClientTest.java](https://github.com/kpelykh/docker-java/blob/master/src/test/java/com/kpelykh/docker/client/test/DockerClientTest.java "DockerClientTest.java") +## Configuration + +There are a couple of configuration items, all of which have sensible defaults: + +* `url` The Docker URL, e.g. `http://localhost:4243`. +* `version` The API version, e.g. `1.11`. +* `username` Your repository username (required to push containers). +* `password` Your repository password. +* `email` Your repository email. + +There are three ways to configure, in descending order of precedence: + +##### Programatic: +In your application, e.g. + + DockerClient docker = new DockerClient("http://localhost:4243"); + docker.setCredentials("dockeruser", "ilovedocker", "dockeruser@github.com");` + +##### System Properties: +E.g. + + java -Ddocker.io.username=kpelykh pkg.Main + +##### File System +In `$HOME/.docker.io.properties`, e.g.: + + docker.io.username=dockeruser + +##### Class Path +In the class path at `/docker.io.properties`, e.g.: + + docker.io.url=http://localhost:4243 + docker.io.version=1.11 diff --git a/src/main/java/com/kpelykh/docker/client/Config.java b/src/main/java/com/kpelykh/docker/client/Config.java index e5ae6115..aa029a22 100644 --- a/src/main/java/com/kpelykh/docker/client/Config.java +++ b/src/main/java/com/kpelykh/docker/client/Config.java @@ -17,7 +17,7 @@ static Config createConfig() throws DockerException { final Properties p = new Properties(); try { - p.load(DockerClient.class.getResourceAsStream("/docker.io.properties")); + p.load(Config.class.getResourceAsStream("/docker.io.properties")); } catch (IOException e) { throw new DockerException(e); } From 62be275033d70340dee7ff0a01ea600df56c6cdf Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Thu, 22 May 2014 22:02:23 +0200 Subject: [PATCH 3/7] Update README.md --- README.md | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index c3e292de..24cfc9ad 100644 --- a/README.md +++ b/README.md @@ -14,13 +14,9 @@ Developer forum for [docker-java](https://groups.google.com/forum/?hl=de#!forum/ * Maven 3.0.5 * Docker daemon running -Maven will run tests during build process. Tests are using localhost instance of Docker, make sure that -you have Docker running for tests to work or just turn off tests. - -If you don't have Docker running locally, you can skip tests with -DskipTests flag set to true: - - $ mvn clean install -DskipTests=true +Maven may run tests during build process but tests are disabled by default. The tests are using a localhost instance of Docker, make sure that you have Docker running for tests to work. To run the tests you have to provide your https://www.docker.io/account/login/ information: + $ mvn clean install -DskipTests=false -Ddocker.io.username=... -Ddocker.io.password=... -Ddocker.io.email=... By default Docker server is using UNIX sockets for communication with the Docker client, however docker-java client uses TCP/IP to connect to the Docker server, so you will need to make sure that your Docker server is From 620e45605dae20333ca5d5dc8483cd38005f6369 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Fri, 23 May 2014 22:15:55 +0200 Subject: [PATCH 4/7] Various fixes --- .../com/kpelykh/docker/client/Config.java | 18 +++++------ .../kpelykh/docker/client/DockerClient.java | 2 +- .../model/ContainerInspectResponse.java | 10 +++---- .../client/model/ImageInspectResponse.java | 6 ++-- .../client/test/AbstractDockerClientTest.java | 4 ++- .../docker/client/test/DockerClientTest.java | 30 +++++++++++++++---- 6 files changed, 46 insertions(+), 24 deletions(-) diff --git a/src/main/java/com/kpelykh/docker/client/Config.java b/src/main/java/com/kpelykh/docker/client/Config.java index aa029a22..f6e59d76 100644 --- a/src/main/java/com/kpelykh/docker/client/Config.java +++ b/src/main/java/com/kpelykh/docker/client/Config.java @@ -22,16 +22,9 @@ static Config createConfig() throws DockerException { throw new DockerException(e); } - for (String s : new String[]{"url", "version", "username", "password", "email"}) { - final String key = "docker.io." + s; - if (System.getProperties().keySet().contains(key)) { - p.setProperty(key, System.getProperty(key)); - } - } + final File file = new File(System.getProperty("user.home"), ".docker.io.properties"); - final File file = new File(System.getProperty("user.name"), ".docker.io.properties"); - System.out.println(file); - if (file.isFile()) { + if (file.isFile()) { try { final FileInputStream in = new FileInputStream(file); try { @@ -44,6 +37,13 @@ static Config createConfig() throws DockerException { } } + for (String s : new String[]{"url", "version", "username", "password", "email"}) { + final String key = "docker.io." + s; + if (System.getProperties().keySet().contains(key)) { + p.setProperty(key, System.getProperty(key)); + } + } + final Config c = new Config(); c.url = URI.create(p.getProperty("docker.io.url")); diff --git a/src/main/java/com/kpelykh/docker/client/DockerClient.java b/src/main/java/com/kpelykh/docker/client/DockerClient.java index d1070f80..7bba645f 100644 --- a/src/main/java/com/kpelykh/docker/client/DockerClient.java +++ b/src/main/java/com/kpelykh/docker/client/DockerClient.java @@ -108,7 +108,7 @@ public void setCredentials(String username, String password, String email) { } authConfig = new AuthConfig(); authConfig.setUsername(username); - authConfig.setPassword(password); + authConfig.setPassword(password); authConfig.setEmail(email); } diff --git a/src/main/java/com/kpelykh/docker/client/model/ContainerInspectResponse.java b/src/main/java/com/kpelykh/docker/client/model/ContainerInspectResponse.java index 555842e7..d686f9eb 100644 --- a/src/main/java/com/kpelykh/docker/client/model/ContainerInspectResponse.java +++ b/src/main/java/com/kpelykh/docker/client/model/ContainerInspectResponse.java @@ -33,7 +33,7 @@ public class ContainerInspectResponse { private ContainerState state; @JsonProperty("Image") - private String image; + private String imageId; @JsonProperty("NetworkSettings") private NetworkSettings networkSettings; @@ -119,12 +119,12 @@ public void setState(ContainerState state) { this.state = state; } - public String getImage() { - return image; + public String getImageId() { + return imageId; } - public void setImage(String image) { - this.image = image; + public void setImageId(String image) { + this.imageId = image; } public NetworkSettings getNetworkSettings() { diff --git a/src/main/java/com/kpelykh/docker/client/model/ImageInspectResponse.java b/src/main/java/com/kpelykh/docker/client/model/ImageInspectResponse.java index a7b4409e..3514670c 100644 --- a/src/main/java/com/kpelykh/docker/client/model/ImageInspectResponse.java +++ b/src/main/java/com/kpelykh/docker/client/model/ImageInspectResponse.java @@ -22,7 +22,7 @@ public class ImageInspectResponse { @JsonProperty("container_config") private ContainerConfig containerConfig; - @JsonProperty("Size") private int size; + @JsonProperty("Size") private long size; @JsonProperty("docker_version") private String dockerVersion; @@ -76,11 +76,11 @@ public void setContainerConfig(ContainerConfig containerConfig) { this.containerConfig = containerConfig; } - public int getSize() { + public long getSize() { return size; } - public void setSize(int size) { + public void setSize(long size) { this.size = size; } diff --git a/src/test/java/com/kpelykh/docker/client/test/AbstractDockerClientTest.java b/src/test/java/com/kpelykh/docker/client/test/AbstractDockerClientTest.java index 8904702e..d8313ca4 100644 --- a/src/test/java/com/kpelykh/docker/client/test/AbstractDockerClientTest.java +++ b/src/test/java/com/kpelykh/docker/client/test/AbstractDockerClientTest.java @@ -30,9 +30,11 @@ public void beforeTest() throws DockerException { LOG.info("Connecting to Docker server at " + url); dockerClient = new DockerClient(url); - LOG.info("Creating image 'busybox'"); + LOG.info("Pulling image 'busybox'"); // need to block until image is pulled completely logResponseStream(dockerClient.pull("busybox")); + + assertNotNull(dockerClient); LOG.info("======================= END OF BEFORETEST =======================\n\n"); diff --git a/src/test/java/com/kpelykh/docker/client/test/DockerClientTest.java b/src/test/java/com/kpelykh/docker/client/test/DockerClientTest.java index 2267e766..ccf09ea9 100644 --- a/src/test/java/com/kpelykh/docker/client/test/DockerClientTest.java +++ b/src/test/java/com/kpelykh/docker/client/test/DockerClientTest.java @@ -151,6 +151,14 @@ public void testImages() throws DockerException { @Test public void testListContainers() throws DockerException { + + String testImage = "hackmann/empty"; + + LOG.info("Pulling image 'hackmann/empty'"); + // need to block until image is pulled completely + logResponseStream(dockerClient.pull(testImage)); + tmpImgs.add(testImage); + List containers = dockerClient.listContainers(true); assertThat(containers, notNullValue()); LOG.info("Container List: {}", containers); @@ -158,18 +166,30 @@ public void testListContainers() throws DockerException { int size = containers.size(); ContainerConfig containerConfig = new ContainerConfig(); - containerConfig.setImage("busybox"); + containerConfig.setImage(testImage); containerConfig.setCmd(new String[] { "echo" }); ContainerCreateResponse container1 = dockerClient .createContainer(containerConfig); + assertThat(container1.getId(), not(isEmptyString())); + + ContainerInspectResponse containerInspectResponse = dockerClient.inspectContainer(container1.getId()); + + assertThat(containerInspectResponse.getConfig().getImage(), is(equalTo(testImage))); + + dockerClient.startContainer(container1.getId()); tmpContainers.add(container1.getId()); LOG.info("container id: " + container1.getId()); - List containers2 = dockerClient.listContainers(true); + List containers2 = dockerClient.listContainers(true); + + for(Container container: containers2) { + LOG.info("listContainer: id=" + container.getId() +" image=" + container.getImage()); + } + assertThat(size + 1, is(equalTo(containers2.size()))); Matcher matcher = hasItem(hasField("id", startsWith(container1.getId()))); assertThat(containers2, matcher); @@ -179,12 +199,12 @@ public void testListContainers() throws DockerException { assertThat(filteredContainers.size(), is(equalTo(1))); for(Container container: filteredContainers) { - LOG.info("container: " + container); + LOG.info("filteredContainer: " + container.getImage()); } Container container2 = filteredContainers.get(0); assertThat(container2.getCommand(), not(isEmptyString())); - assertThat(container2.getImage(), equalTo("busybox:latest")); + assertThat(container2.getImage(), equalTo(testImage + ":latest")); } /* @@ -232,7 +252,7 @@ public void testStartContainer() throws DockerException { assertThat(containerInspectResponse.getId(), startsWith(container.getId())); - assertThat(containerInspectResponse.getImage(), not(isEmptyString())); + assertThat(containerInspectResponse.getImageId(), not(isEmptyString())); assertThat(containerInspectResponse.getState(), is(notNullValue())); assertThat(containerInspectResponse.getState().running, is(true)); From 9aa7c50217fc85152cf20bc515ef1a2a19856eef Mon Sep 17 00:00:00 2001 From: Vojtech Juranek Date: Sun, 8 Jun 2014 23:10:39 +0200 Subject: [PATCH 5/7] Add ping method --- .../com/kpelykh/docker/client/DockerClient.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/main/java/com/kpelykh/docker/client/DockerClient.java b/src/main/java/com/kpelykh/docker/client/DockerClient.java index 7bba645f..c9719c6b 100644 --- a/src/main/java/com/kpelykh/docker/client/DockerClient.java +++ b/src/main/java/com/kpelykh/docker/client/DockerClient.java @@ -190,6 +190,19 @@ public Version version() throws DockerException { } } } + + + public int ping() throws DockerException { + WebResource webResource = client.resource(restEndpointUrl + "/_ping"); + + try { + LOGGER.trace("GET: {}", webResource); + ClientResponse resp = webResource.get(ClientResponse.class); + return resp.getStatus(); + } catch (UniformInterfaceException exception) { + throw new DockerException(exception); + } + } /** From 1a997a0b783d2f4363c78bfdb13c7be5d97ac7e5 Mon Sep 17 00:00:00 2001 From: Yoann Dubreuil Date: Tue, 10 Jun 2014 16:19:01 +0200 Subject: [PATCH 6/7] add tag method on image --- .../kpelykh/docker/client/DockerClient.java | 30 +++++++++++++++++++ .../docker/client/test/DockerClientTest.java | 12 ++++++++ 2 files changed, 42 insertions(+) diff --git a/src/main/java/com/kpelykh/docker/client/DockerClient.java b/src/main/java/com/kpelykh/docker/client/DockerClient.java index c9719c6b..101d7209 100644 --- a/src/main/java/com/kpelykh/docker/client/DockerClient.java +++ b/src/main/java/com/kpelykh/docker/client/DockerClient.java @@ -293,6 +293,36 @@ private String name(String name) { return name.contains("/") ? name : authConfig.getUsername(); } + /** + * Tag an image into a repository + * + * @param image the local image to tag (either a name or an id) + * @param repository the repository to tag in + * @param tag any tag for this image + * @param force (not documented) + * @return the HTTP status code (201 for success) + */ + public int tag(String image, String repository, String tag, boolean force) throws DockerException { + Preconditions.checkNotNull(image, "image was not specified"); + Preconditions.checkNotNull(repository, "repository was not specified"); + Preconditions.checkNotNull(tag, " tag was not provided"); + + MultivaluedMap params = new MultivaluedMapImpl(); + params.add("repo", repository); + params.add("tag", tag); + params.add("force", String.valueOf(force)); + + WebResource webResource = client.resource(restEndpointUrl + "/images/" + image + "/tag").queryParams(params); + + try { + LOGGER.trace("POST: {}", webResource); + ClientResponse resp = webResource.post(ClientResponse.class); + return resp.getStatus(); + } catch (UniformInterfaceException exception) { + throw new DockerException(exception); + } + } + /** * Create an image by importing the given stream of a tar file. * diff --git a/src/test/java/com/kpelykh/docker/client/test/DockerClientTest.java b/src/test/java/com/kpelykh/docker/client/test/DockerClientTest.java index ccf09ea9..f6af3823 100644 --- a/src/test/java/com/kpelykh/docker/client/test/DockerClientTest.java +++ b/src/test/java/com/kpelykh/docker/client/test/DockerClientTest.java @@ -25,10 +25,12 @@ import java.net.DatagramSocket; import java.net.ServerSocket; import java.util.List; +import java.util.Random; import org.apache.commons.io.IOUtils; import org.apache.commons.io.LineIterator; import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang.math.RandomUtils; import org.hamcrest.Matcher; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -569,6 +571,16 @@ public void testRemoveImage() throws DockerException, InterruptedException { assertThat(containers, matcher); } + @Test + public void testTagImage() throws DockerException, InterruptedException { + String tag = String.valueOf(RandomUtils.nextInt(Integer.MAX_VALUE)); + + Integer result = dockerClient.tag("busybox:latest", "docker-java/busybox", tag, false); + assertThat(result, equalTo(Integer.valueOf(201))); + + dockerClient.removeImage("docker-java/busybox:" + tag); + } + /* * * ################ ## MISC TESTS ## ################ From 26b4069bb1985a8c293a016aaf9b56979771d75b Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Thu, 12 Jun 2014 20:27:06 +0200 Subject: [PATCH 7/7] Update README.md --- README.md | 146 +----------------------------------------------------- 1 file changed, 2 insertions(+), 144 deletions(-) diff --git a/README.md b/README.md index 24cfc9ad..a51128f7 100644 --- a/README.md +++ b/README.md @@ -1,145 +1,3 @@ -# docker-java +This project has moved to https://github.com/docker-java/docker-java +-------------------------------------------------------------------- -Java API client for [Docker](http://docs.docker.io/ "Docker") - -Supports a subset of the Docker Client API v1.11, Docker Server version 0.11 - -Developer forum for [docker-java](https://groups.google.com/forum/?hl=de#!forum/docker-java-dev "docker-java") - -## Build with Maven - -###### Prerequisites: - -* Java 1.6+ -* Maven 3.0.5 -* Docker daemon running - -Maven may run tests during build process but tests are disabled by default. The tests are using a localhost instance of Docker, make sure that you have Docker running for tests to work. To run the tests you have to provide your https://www.docker.io/account/login/ information: - - $ mvn clean install -DskipTests=false -Ddocker.io.username=... -Ddocker.io.password=... -Ddocker.io.email=... - -By default Docker server is using UNIX sockets for communication with the Docker client, however docker-java -client uses TCP/IP to connect to the Docker server, so you will need to make sure that your Docker server is -listening on TCP port. To allow Docker server to use TCP add the following line to /etc/default/docker - - DOCKER_OPTS="-H tcp://127.0.0.1:4243 -H unix:///var/run/docker.sock" - -More details setting up docket server can be found in official documentation: http://docs.docker.io/en/latest/use/basics/ - -Now make sure that docker is up: - - $ docker -H tcp://127.0.0.1:4243 version - - Client version: 0.8.1 - Go version (client): go1.2 - Git commit (client): a1598d1 - Server version: 0.8.1 - Git commit (server): a1598d1 - Go version (server): go1.2 - Last stable version: 0.8.1 - -Run build with tests: - - $ mvn clean install - -## Docker-Java maven dependency: - - - com.kpelykh - docker-java - 0.8.1 - - - -## Example code snippets: - - DockerClient dockerClient = new DockerClient("http://localhost:4243"); - -###### Get Docker info: - - Info info = dockerClient.info(); - System.out.print(info); - -###### Search Docker repository: - - List dockerSearch = dockerClient.search("busybox"); - System.out.println("Search returned" + dockerSearch.toString()); - -###### Create new Docker container, wait for its start and stop it: - - ContainerConfig containerConfig = new ContainerConfig(); - containerConfig.setImage("busybox"); - containerConfig.setCmd(new String[] {"touch", "/test"}); - ContainerCreateResponse container = dockerClient.createContainer(containerConfig); - - dockerClient.startContainer(container.id); - - dockerClient.waitContainer(container.id); - - dockerClient.stopContainer(container.id); - - -##### Support for UNIX sockets: - - Support for UNIX socket should appear in docker-java pretty soon. I'm working on its integration. - -##### Docker Builder: - -To use Docker Builder, as described on page http://docs.docker.io/en/latest/use/builder/, -user dockerClient.build(baseDir), where baseDir is a path to folder containing Dockerfile. - - - File baseDir = new File("~/kpelykh/docker/netcat"); - - ClientResponse response = dockerClient.build(baseDir); - - StringWriter logwriter = new StringWriter(); - - try { - LineIterator itr = IOUtils.lineIterator(response.getEntityInputStream(), "UTF-8"); - while (itr.hasNext()) { - String line = itr.next(); - logwriter.write(line); - LOG.info(line); - } - } finally { - IOUtils.closeQuietly(response.getEntityInputStream()); - } - - - -For additional examples, please look at [DockerClientTest.java](https://github.com/kpelykh/docker-java/blob/master/src/test/java/com/kpelykh/docker/client/test/DockerClientTest.java "DockerClientTest.java") - -## Configuration - -There are a couple of configuration items, all of which have sensible defaults: - -* `url` The Docker URL, e.g. `http://localhost:4243`. -* `version` The API version, e.g. `1.11`. -* `username` Your repository username (required to push containers). -* `password` Your repository password. -* `email` Your repository email. - -There are three ways to configure, in descending order of precedence: - -##### Programatic: -In your application, e.g. - - DockerClient docker = new DockerClient("http://localhost:4243"); - docker.setCredentials("dockeruser", "ilovedocker", "dockeruser@github.com");` - -##### System Properties: -E.g. - - java -Ddocker.io.username=kpelykh pkg.Main - -##### File System -In `$HOME/.docker.io.properties`, e.g.: - - docker.io.username=dockeruser - -##### Class Path -In the class path at `/docker.io.properties`, e.g.: - - docker.io.url=http://localhost:4243 - docker.io.version=1.11