diff --git a/daemon/cluster/cluster.go b/daemon/cluster/cluster.go index 8aab1995ad..dd8703401d 100644 --- a/daemon/cluster/cluster.go +++ b/daemon/cluster/cluster.go @@ -554,7 +554,11 @@ func (c *Cluster) Leave(force bool) error { } c.Unlock() if nodeID := node.NodeID(); nodeID != "" { - for _, id := range c.config.Backend.ListContainersForNode(nodeID) { + nodeContainers, err := c.listContainerForNode(nodeID) + if err != nil { + return err + } + for _, id := range nodeContainers { if err := c.config.Backend.ContainerRm(id, &apitypes.ContainerRmConfig{ForceRemove: true}); err != nil { logrus.Errorf("error removing %v: %v", id, err) } @@ -568,6 +572,22 @@ func (c *Cluster) Leave(force bool) error { return nil } +func (c *Cluster) listContainerForNode(nodeID string) ([]string, error) { + var ids []string + filters := filters.NewArgs() + filters.Add("label", fmt.Sprintf("com.docker.swarm.node.id=%s", nodeID)) + containers, err := c.config.Backend.Containers(&apitypes.ContainerListOptions{ + Filter: filters, + }) + if err != nil { + return []string{}, err + } + for _, c := range containers { + ids = append(ids, c.ID) + } + return ids, nil +} + func (c *Cluster) clearState() error { // todo: backup this data instead of removing? if err := os.RemoveAll(c.root); err != nil { diff --git a/daemon/cluster/executor/backend.go b/daemon/cluster/executor/backend.go index 9fa8ef70b1..4576b106bf 100644 --- a/daemon/cluster/executor/backend.go +++ b/daemon/cluster/executor/backend.go @@ -34,7 +34,7 @@ type Backend interface { ContainerKill(name string, sig uint64) error SystemInfo() (*types.Info, error) VolumeCreate(name, driverName string, opts, labels map[string]string) (*types.Volume, error) - ListContainersForNode(nodeID string) []string + Containers(config *types.ContainerListOptions) ([]*types.Container, error) SetNetworkBootstrapKeys([]*networktypes.EncryptionKey) error SetClusterProvider(provider cluster.Provider) IsSwarmCompatible() error diff --git a/daemon/list.go b/daemon/list.go index 46d7eb18b8..07b9cafcd8 100644 --- a/daemon/list.go +++ b/daemon/list.go @@ -102,17 +102,6 @@ func (daemon *Daemon) Containers(config *types.ContainerListOptions) ([]*types.C return daemon.reduceContainers(config, daemon.transformContainer) } -// ListContainersForNode returns all containerID that match the specified nodeID -func (daemon *Daemon) ListContainersForNode(nodeID string) []string { - var ids []string - for _, c := range daemon.List() { - if c.Config.Labels["com.docker.swarm.node.id"] == nodeID { - ids = append(ids, c.ID) - } - } - return ids -} - func (daemon *Daemon) filterByNameIDMatches(ctx *listContext) []*container.Container { idSearch := false names := ctx.filters.Get("name")