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 diff --git a/src/main/java/com/kpelykh/docker/client/DockerClient.java b/src/main/java/com/kpelykh/docker/client/DockerClient.java index 7bba645f..101d7209 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); + } + } /** @@ -280,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 ## ################