mirror of
https://github.com/moby/moby.git
synced 2025-07-14 15:41:16 +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())
|
|
}
|