From 742bb8c724ffc8ce6da28bfe3c5a353cc1db74bf Mon Sep 17 00:00:00 2001 From: Victor Marmol Date: Mon, 17 Nov 2014 10:28:55 -0800 Subject: [PATCH] Do not duplicate Docker container output. Since Docker containers are known by more than one name we were returning them once for every name they're known by. This change makes the returned containers unique. --- manager/manager.go | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/manager/manager.go b/manager/manager.go index 3b02d3bc..4c4c0951 100644 --- a/manager/manager.go +++ b/manager/manager.go @@ -269,17 +269,17 @@ func (self *manager) SubcontainersInfo(containerName string, query *info.Contain } func (self *manager) DockerContainersInfo(containerName string, query *info.ContainerInfoRequest) ([]*info.ContainerInfo, error) { - var containers []*containerData + var containers map[string]*containerData err := func() error { self.containersLock.RLock() defer self.containersLock.RUnlock() - containers = make([]*containerData, 0, len(self.containers)) + containers = make(map[string]*containerData, len(self.containers)) if containerName == "/" { - // Get all the Docker containers. - for i := range self.containers { - if docker.IsDockerContainerName(self.containers[i].info.Name) { - containers = append(containers, self.containers[i]) + // Get all the unique containers in the Docker namespace. + for name, cont := range self.containers { + if name.Namespace == docker.DockerNamespace { + containers[cont.info.Name] = cont } } } else { @@ -289,7 +289,7 @@ func (self *manager) DockerContainersInfo(containerName string, query *info.Cont Name: containerName, }] if ok { - containers = append(containers, cont) + containers[cont.info.Name] = cont } else { return fmt.Errorf("unable to find Docker container %q", containerName) } @@ -300,7 +300,13 @@ func (self *manager) DockerContainersInfo(containerName string, query *info.Cont return nil, err } - return self.containerDataSliceToContainerInfoSlice(containers, query) + // Convert to a slice. + containersSlice := make([]*containerData, 0, len(containers)) + for _, cont := range containers { + containersSlice = append(containersSlice, cont) + } + + return self.containerDataSliceToContainerInfoSlice(containersSlice, query) } func (self *manager) containerDataSliceToContainerInfoSlice(containers []*containerData, query *info.ContainerInfoRequest) ([]*info.ContainerInfo, error) {