mirror of
https://github.com/moby/moby.git
synced 2025-04-18 20:44:11 +03:00
Since commit f2a183a99, `getEndpointPortMapInfo` is called for all the endpoints of a container to get its complete list of port mappings. This is required as multiple endpoints might publish different ports (e.g. IPv4-only and IPv6-only endpoints mapping an IPv4 and an IPv6 port). `getEndpointPortMapInfo` calls `(*Endpoint).DriverInfo()` which has a dodgy behavior: if the endpoint is part of a sandbox that also has an endpoint for the `docker_gwbridge` network, then `(*Endpoint).DriverInfo()` returns the DriverInfo of that `docker_gwbridge` endpoint in place of the current Endpoint's DriverInfo. On overlay networks, host port-mappings are made through the `docker_gwbridge` network (which is automatically attached to all Swarm tasks). This results in duplicated port mappings reported for all Swarm containers. Since `getEndpointPortMapInfo` is the only place where `(*Endpoint).DriverInfo()` is called, just remove that dodgy behavior. `(*Endpoint).DriverInfo()` has an OS-specific implementation. Unlike the Linux implementation, on Windows, `DriverInfo()` returns the DriverInfo of the gateway endpoint _in addition_ to the current Endpoint's DriverInfo. So it shouldn't be affected by this bug -- don't touch it. Signed-off-by: Albin Kerouanton <albinker@gmail.com>
26 lines
618 B
Go
26 lines
618 B
Go
//go:build !windows
|
|
|
|
package libnetwork
|
|
|
|
import "fmt"
|
|
|
|
// DriverInfo returns a collection of driver operational data related to this endpoint retrieved from the driver.
|
|
func (ep *Endpoint) DriverInfo() (map[string]interface{}, error) {
|
|
ep, err := ep.retrieveFromStore()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
n, err := ep.getNetworkFromStore()
|
|
if err != nil {
|
|
return nil, fmt.Errorf("could not find network in store for driver info: %v", err)
|
|
}
|
|
|
|
driver, err := n.driver(true)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to get driver info: %v", err)
|
|
}
|
|
|
|
return driver.EndpointOperInfo(n.ID(), ep.ID())
|
|
}
|