|
@@ -1,11 +1,13 @@
|
|
|
package daemon
|
|
|
|
|
|
import (
|
|
|
+ "fmt"
|
|
|
"regexp"
|
|
|
|
|
|
"github.com/Sirupsen/logrus"
|
|
|
"github.com/docker/distribution/digest"
|
|
|
"github.com/docker/docker/api/types"
|
|
|
+ "github.com/docker/docker/api/types/filters"
|
|
|
"github.com/docker/docker/image"
|
|
|
"github.com/docker/docker/layer"
|
|
|
"github.com/docker/docker/pkg/directory"
|
|
@@ -16,7 +18,7 @@ import (
|
|
|
)
|
|
|
|
|
|
// ContainersPrune removes unused containers
|
|
|
-func (daemon *Daemon) ContainersPrune(config *types.ContainersPruneConfig) (*types.ContainersPruneReport, error) {
|
|
|
+func (daemon *Daemon) ContainersPrune(pruneFilters filters.Args) (*types.ContainersPruneReport, error) {
|
|
|
rep := &types.ContainersPruneReport{}
|
|
|
|
|
|
allContainers := daemon.List()
|
|
@@ -40,7 +42,7 @@ func (daemon *Daemon) ContainersPrune(config *types.ContainersPruneConfig) (*typ
|
|
|
}
|
|
|
|
|
|
// VolumesPrune removes unused local volumes
|
|
|
-func (daemon *Daemon) VolumesPrune(config *types.VolumesPruneConfig) (*types.VolumesPruneReport, error) {
|
|
|
+func (daemon *Daemon) VolumesPrune(pruneFilters filters.Args) (*types.VolumesPruneReport, error) {
|
|
|
rep := &types.VolumesPruneReport{}
|
|
|
|
|
|
pruneVols := func(v volume.Volume) error {
|
|
@@ -70,11 +72,20 @@ func (daemon *Daemon) VolumesPrune(config *types.VolumesPruneConfig) (*types.Vol
|
|
|
}
|
|
|
|
|
|
// ImagesPrune removes unused images
|
|
|
-func (daemon *Daemon) ImagesPrune(config *types.ImagesPruneConfig) (*types.ImagesPruneReport, error) {
|
|
|
+func (daemon *Daemon) ImagesPrune(pruneFilters filters.Args) (*types.ImagesPruneReport, error) {
|
|
|
rep := &types.ImagesPruneReport{}
|
|
|
|
|
|
+ danglingOnly := true
|
|
|
+ if pruneFilters.Include("dangling") {
|
|
|
+ if pruneFilters.ExactMatch("dangling", "false") || pruneFilters.ExactMatch("dangling", "0") {
|
|
|
+ danglingOnly = false
|
|
|
+ } else if !pruneFilters.ExactMatch("dangling", "true") && !pruneFilters.ExactMatch("dangling", "1") {
|
|
|
+ return nil, fmt.Errorf("Invalid filter 'dangling=%s'", pruneFilters.Get("dangling"))
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
var allImages map[image.ID]*image.Image
|
|
|
- if config.DanglingOnly {
|
|
|
+ if danglingOnly {
|
|
|
allImages = daemon.imageStore.Heads()
|
|
|
} else {
|
|
|
allImages = daemon.imageStore.Map()
|
|
@@ -106,7 +117,7 @@ func (daemon *Daemon) ImagesPrune(config *types.ImagesPruneConfig) (*types.Image
|
|
|
deletedImages := []types.ImageDelete{}
|
|
|
refs := daemon.referenceStore.References(dgst)
|
|
|
if len(refs) > 0 {
|
|
|
- if config.DanglingOnly {
|
|
|
+ if danglingOnly {
|
|
|
// Not a dangling image
|
|
|
continue
|
|
|
}
|
|
@@ -156,7 +167,7 @@ func (daemon *Daemon) ImagesPrune(config *types.ImagesPruneConfig) (*types.Image
|
|
|
}
|
|
|
|
|
|
// localNetworksPrune removes unused local networks
|
|
|
-func (daemon *Daemon) localNetworksPrune(config *types.NetworksPruneConfig) (*types.NetworksPruneReport, error) {
|
|
|
+func (daemon *Daemon) localNetworksPrune(pruneFilters filters.Args) (*types.NetworksPruneReport, error) {
|
|
|
rep := &types.NetworksPruneReport{}
|
|
|
var err error
|
|
|
// When the function returns true, the walk will stop.
|
|
@@ -177,7 +188,7 @@ func (daemon *Daemon) localNetworksPrune(config *types.NetworksPruneConfig) (*ty
|
|
|
}
|
|
|
|
|
|
// clusterNetworksPrune removes unused cluster networks
|
|
|
-func (daemon *Daemon) clusterNetworksPrune(config *types.NetworksPruneConfig) (*types.NetworksPruneReport, error) {
|
|
|
+func (daemon *Daemon) clusterNetworksPrune(pruneFilters filters.Args) (*types.NetworksPruneReport, error) {
|
|
|
rep := &types.NetworksPruneReport{}
|
|
|
cluster := daemon.GetCluster()
|
|
|
networks, err := cluster.GetNetworks()
|
|
@@ -207,15 +218,15 @@ func (daemon *Daemon) clusterNetworksPrune(config *types.NetworksPruneConfig) (*
|
|
|
}
|
|
|
|
|
|
// NetworksPrune removes unused networks
|
|
|
-func (daemon *Daemon) NetworksPrune(config *types.NetworksPruneConfig) (*types.NetworksPruneReport, error) {
|
|
|
+func (daemon *Daemon) NetworksPrune(pruneFilters filters.Args) (*types.NetworksPruneReport, error) {
|
|
|
rep := &types.NetworksPruneReport{}
|
|
|
- clusterRep, err := daemon.clusterNetworksPrune(config)
|
|
|
+ clusterRep, err := daemon.clusterNetworksPrune(pruneFilters)
|
|
|
if err != nil {
|
|
|
logrus.Warnf("could not remove cluster networks: %v", err)
|
|
|
} else {
|
|
|
rep.NetworksDeleted = append(rep.NetworksDeleted, clusterRep.NetworksDeleted...)
|
|
|
}
|
|
|
- localRep, err := daemon.localNetworksPrune(config)
|
|
|
+ localRep, err := daemon.localNetworksPrune(pruneFilters)
|
|
|
if err != nil {
|
|
|
logrus.Warnf("could not remove local networks: %v", err)
|
|
|
} else {
|