diff --git a/libnetwork/drivers/bridge/bridge.go b/libnetwork/drivers/bridge/bridge.go index 9461abc452..0d399055aa 100644 --- a/libnetwork/drivers/bridge/bridge.go +++ b/libnetwork/drivers/bridge/bridge.go @@ -60,11 +60,12 @@ type ContainerConfiguration struct { } type bridgeEndpoint struct { - id types.UUID - intf *sandbox.Interface - macAddress net.HardwareAddr - config *EndpointConfiguration // User specified parameters - portMapping []netutils.PortBinding // Operation port bindings + id types.UUID + intf *sandbox.Interface + macAddress net.HardwareAddr + config *EndpointConfiguration // User specified parameters + containerConfig *ContainerConfiguration + portMapping []netutils.PortBinding // Operation port bindings } type bridgeNetwork struct { @@ -643,6 +644,8 @@ func (d *driver) Leave(nid, eid types.UUID, options map[string]interface{}) erro } func (d *driver) link(nid, eid types.UUID, options map[string]interface{}, enable bool) error { + var cc *ContainerConfiguration + network, err := d.getNetwork(nid) if err != nil { return err @@ -656,10 +659,15 @@ func (d *driver) link(nid, eid types.UUID, options map[string]interface{}, enabl return EndpointNotFoundError(eid) } - cc, err := parseContainerOptions(options) - if err != nil { - return err + if enable { + cc, err = parseContainerOptions(options) + if err != nil { + return err + } + } else { + cc = endpoint.containerConfig } + if cc == nil { return nil } @@ -725,6 +733,11 @@ func (d *driver) link(nid, eid types.UUID, options map[string]interface{}, enabl l.Disable() } } + + if enable { + endpoint.containerConfig = cc + } + return nil } diff --git a/libnetwork/endpoint.go b/libnetwork/endpoint.go index 70dd600ef3..35b58af5d7 100644 --- a/libnetwork/endpoint.go +++ b/libnetwork/endpoint.go @@ -5,6 +5,7 @@ import ( "os" "path/filepath" + "github.com/Sirupsen/logrus" "github.com/docker/docker/pkg/etchosts" "github.com/docker/docker/pkg/resolvconf" "github.com/docker/libnetwork/driverapi" @@ -275,6 +276,18 @@ func (ep *endpoint) Leave(containerID string, options ...EndpointOption) error { n := ep.network err := n.driver.Leave(n.id, ep.id, ep.context) + + sinfo := ep.SandboxInfo() + if sinfo != nil { + sb := ep.network.ctrlr.sandboxGet(ep.container.data.SandboxKey) + for _, i := range sinfo.Interfaces { + err = sb.RemoveInterface(i) + if err != nil { + logrus.Debugf("Remove interface failed: %v", err) + } + } + } + ep.network.ctrlr.sandboxRm(ep.container.data.SandboxKey) ep.container = nil ep.context = nil