From 796d540fdff56ea5ea37d45730b7d17068d4737b Mon Sep 17 00:00:00 2001 From: Tobias Gesellchen Date: Thu, 29 Dec 2016 22:24:04 +0100 Subject: [PATCH] add prune sub-command for containers and images --- client/build.gradle | 10 ++++----- .../docker/client/DockerClient.groovy | 8 +++++++ .../docker/client/DockerClientImpl.groovy | 22 +++++++++++++++++++ .../docker/client/DockerClientImplSpec.groovy | 22 +++++++++++++++++++ roadmap.md | 7 +++--- 5 files changed, 61 insertions(+), 8 deletions(-) diff --git a/client/build.gradle b/client/build.gradle index 94f1ba84..0a112179 100644 --- a/client/build.gradle +++ b/client/build.gradle @@ -8,8 +8,8 @@ buildscript { } dependencies { - classpath 'net.saliman:gradle-cobertura-plugin:2.3.2' - classpath 'org.kt3k.gradle.plugin:coveralls-gradle-plugin:2.6.3' + classpath 'net.saliman:gradle-cobertura-plugin:2.4.0' + classpath 'org.kt3k.gradle.plugin:coveralls-gradle-plugin:2.7.1' classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.7.3' } @@ -47,7 +47,7 @@ dependencies { compile 'com.squareup.okhttp3:okhttp:3.5.0' testCompile 'com.squareup.okhttp3:mockwebserver:3.5.0' - compile 'org.apache.commons:commons-compress:1.12' + compile 'org.apache.commons:commons-compress:1.13' compile('com.kohlschutter.junixsocket:junixsocket-native-common:2.0.4') { exclude module: 'log4j' @@ -56,7 +56,7 @@ dependencies { exclude module: 'log4j' } - compile 'org.bouncycastle:bcpkix-jdk15on:1.55' + compile 'org.bouncycastle:bcpkix-jdk15on:1.56' testCompile project(':testutil') @@ -69,7 +69,7 @@ dependencies { testCompile 'net.jodah:failsafe:1.0.0' - testCompile 'joda-time:joda-time:2.9.6' + testCompile 'joda-time:joda-time:2.9.7' } diff --git a/client/src/main/groovy/de/gesellix/docker/client/DockerClient.groovy b/client/src/main/groovy/de/gesellix/docker/client/DockerClient.groovy index 584008a5..4d587acd 100644 --- a/client/src/main/groovy/de/gesellix/docker/client/DockerClient.groovy +++ b/client/src/main/groovy/de/gesellix/docker/client/DockerClient.groovy @@ -10,8 +10,16 @@ interface DockerClient { def cleanupImages() + def pruneImages() + + def pruneImages(query) + def cleanupContainers(Closure shouldKeepContainer) + def pruneContainers() + + def pruneContainers(query) + def cleanupVolumes(Closure shouldKeepVolume) def ping() diff --git a/client/src/main/groovy/de/gesellix/docker/client/DockerClientImpl.groovy b/client/src/main/groovy/de/gesellix/docker/client/DockerClientImpl.groovy index 5887312a..0d5d8782 100644 --- a/client/src/main/groovy/de/gesellix/docker/client/DockerClientImpl.groovy +++ b/client/src/main/groovy/de/gesellix/docker/client/DockerClientImpl.groovy @@ -74,6 +74,17 @@ class DockerClientImpl implements DockerClient { } } + @Override + pruneContainers(query = [:]) { + log.info "docker container prune" + def actualQuery = query ?: [:] + jsonEncodeFilters(actualQuery) + def response = getHttpClient().post([path : "/containers/prune", + query: actualQuery]) + responseHandler.ensureSuccessfulResponse(response, new IllegalStateException("docker container prune failed")) + return response + } + @Override cleanupImages() { images([filters: [dangling: ["true"]]]).content.each { image -> @@ -82,6 +93,17 @@ class DockerClientImpl implements DockerClient { } } + @Override + pruneImages(query = [:]) { + log.info "docker image prune" + def actualQuery = query ?: [:] + jsonEncodeFilters(actualQuery) + def response = getHttpClient().post([path : "/images/prune", + query: actualQuery]) + responseHandler.ensureSuccessfulResponse(response, new IllegalStateException("docker image prune failed")) + return response + } + @Override cleanupVolumes(Closure shouldKeepVolume) { def allVolumes = volumes([filters: [dangling: ["true"]]]).content.Volumes diff --git a/client/src/test/groovy/de/gesellix/docker/client/DockerClientImplSpec.groovy b/client/src/test/groovy/de/gesellix/docker/client/DockerClientImplSpec.groovy index 16a9d7aa..f73332b7 100644 --- a/client/src/test/groovy/de/gesellix/docker/client/DockerClientImplSpec.groovy +++ b/client/src/test/groovy/de/gesellix/docker/client/DockerClientImplSpec.groovy @@ -1783,6 +1783,15 @@ class DockerClientImplSpec extends Specification { 0 * dockerClient.rmVolume(_) } + def "pruneContainers removes stopped containers"() { + when: + dockerClient.pruneContainers() + + then: + 1 * httpClient.post([path : "/containers/prune", + query: [:]]) >> [status: [success: true]] + } + def "cleanupStorage removes dangling images"() { when: dockerClient.cleanupStorage { container -> false } @@ -1808,6 +1817,19 @@ class DockerClientImplSpec extends Specification { 0 * dockerClient.rmVolume(_) } + def "pruneImages removes unused images"() { + given: + def filters = [dangling: true] + def expectedFilterValue = new JsonBuilder(filters).toString() + + when: + dockerClient.pruneImages([filters: filters]) + + then: + 1 * httpClient.post([path : "/images/prune", + query: [filters: expectedFilterValue]]) >> [status: [success: true]] + } + def "cleanupStorage doesn't remove dangling volumes by default"() { when: dockerClient.cleanupStorage { container -> false } diff --git a/roadmap.md b/roadmap.md index 98b831d4..aa6aa8be 100644 --- a/roadmap.md +++ b/roadmap.md @@ -44,7 +44,7 @@ check out the project at [Java Docker API Client](https://github.com/docker-java * [x] `docker container ps`: List containers (alias for `ls`, `list`) * [x] `docker container pause `: Pause all processes within one or more containers * [ ] `docker container port`: List port mappings or a specific mapping for the container -* [ ] `docker container prune`: Remove all stopped containers +* [x] `docker container prune`: Remove all stopped containers * [x] `docker container rename `: Rename a container * [x] `docker container restart `: Restart one or more containers * [x] `docker container rm `: Remove one or more containers @@ -66,7 +66,7 @@ check out the project at [Java Docker API Client](https://github.com/docker-java * [x] `docker image inspect `: Display detailed information on one or more images * [x] `docker image load`: Load a tarball with a set of images and tags into docker * [x] `docker image ls`: List Images -* [ ] `docker image prune`: Remove unused images (POST /images/prune) +* [x] `docker image prune`: Remove unused images * [x] `docker image pull`: Pull an image or a repository from a registry * [x] `docker image push `: Push an image or a repository to a registry * [x] `docker image rm `: Remove one or more images @@ -134,9 +134,10 @@ check out the project at [Java Docker API Client](https://github.com/docker-java * [ ] `docker plugin create`: Create a plugin from a rootfs and config `POST /plugins/create` * [ ] `docker plugin disable`: Disable a plugin `POST /plugins/{name:.*}/disable` * [ ] `docker plugin enable`: Enable a plugin `POST /plugins/{name:.*}/enable` -* [ ] `docker plugin inspect`: Inspect a plugin `GET /plugins/{name:.*}` +* [ ] `docker plugin inspect`: Inspect a plugin `GET /plugins/{name:.*}/json` * [ ] `docker plugin install`: Install a plugin (equivalent to pull + enable) * [ ] `docker plugin ls`: List plugins `GET /plugins` +* [ ] Get plugin privileges `GET /plugins/privileges` * [ ] `docker plugin push`: Push a plugin `POST /plugins/{name:.*}/push` * [ ] Pull a plugin `POST /plugins/pull` * [ ] `docker plugin rm`: Remove a plugin `DELETE /plugins/{name:.*}`