diff --git a/common/docker/client.go b/common/docker/client.go index 00100186..f85e53b1 100644 --- a/common/docker/client.go +++ b/common/docker/client.go @@ -165,13 +165,25 @@ func (pending pendingStarts) finish(id string) { } } +// AllContainerIDs returns all the IDs of Docker containers, +// whether they are running or not. func (c *Client) AllContainerIDs() ([]string, error) { - all, err := c.ListContainers(docker.ListContainersOptions{All: true}) + return c.containerIDs(true) +} + +// RunningContainerIDs returns all the IDs of the running +// Docker containers. +func (c *Client) RunningContainerIDs() ([]string, error) { + return c.containerIDs(false) +} + +func (c *Client) containerIDs(all bool) ([]string, error) { + containers, err := c.ListContainers(docker.ListContainersOptions{All: all}) if err != nil { return nil, err } var ids []string - for _, c := range all { + for _, c := range containers { ids = append(ids, c.ID) } return ids, nil diff --git a/prog/weaver/main.go b/prog/weaver/main.go index f2666188..371e8a35 100644 --- a/prog/weaver/main.go +++ b/prog/weaver/main.go @@ -306,16 +306,18 @@ func main() { } trackerName = "awsvpc" } - var allContainerIDs []string - if dockerCli != nil { - allContainerIDs, err = dockerCli.AllContainerIDs() - checkFatal(err) - } - preClaims, err := findExistingAddresses(dockerCli, allContainerIDs, weavenet.WeaveBridgeName) + + preClaims, err := findExistingAddresses(dockerCli, weavenet.WeaveBridgeName) checkFatal(err) + allocator, defaultSubnet = createAllocator(router, ipamConfig, preClaims, db, t, isKnownPeer) observeContainers(allocator) - allocator.PruneOwned(allContainerIDs) + + if dockerCli != nil { + allContainerIDs, err := dockerCli.AllContainerIDs() + checkFatal(err) + allocator.PruneOwned(allContainerIDs) + } } var ( diff --git a/prog/weaver/reclaim.go b/prog/weaver/reclaim.go index 5ccae97b..a90edfe9 100644 --- a/prog/weaver/reclaim.go +++ b/prog/weaver/reclaim.go @@ -20,7 +20,7 @@ func a(cidr *net.IPNet) address.CIDR { // Get all the existing Weave IPs at startup, so we can stop IPAM // giving out any as duplicates -func findExistingAddresses(dockerCli *weavedocker.Client, containerIDs []string, bridgeName string) (addrs []ipam.PreClaim, err error) { +func findExistingAddresses(dockerCli *weavedocker.Client, bridgeName string) (addrs []ipam.PreClaim, err error) { Log.Infof("Checking for pre-existing addresses on %s bridge", bridgeName) // First get the address for the bridge bridgeNetDev, err := weavenet.GetBridgeNetDev(bridgeName) @@ -50,6 +50,11 @@ func findExistingAddresses(dockerCli *weavedocker.Client, containerIDs []string, // Now iterate over all containers to see if they have a network // namespace with an attached interface if dockerCli != nil { + containerIDs, err := dockerCli.RunningContainerIDs() + if err != nil { + return nil, err + } + for _, cid := range containerIDs { container, err := dockerCli.InspectContainer(cid) if err != nil {