// +build !windows package daemon import ( "github.com/docker/docker/api/types" "github.com/docker/docker/container" "github.com/pkg/errors" ) // Resolve Network SandboxID in case the container reuse another container's network stack func (daemon *Daemon) getNetworkSandboxID(c *container.Container) (string, error) { curr := c for curr.HostConfig.NetworkMode.IsContainer() { containerID := curr.HostConfig.NetworkMode.ConnectedContainer() connected, err := daemon.GetContainer(containerID) if err != nil { return "", errors.Wrapf(err, "Could not get container for %s", containerID) } curr = connected } return curr.NetworkSettings.SandboxID, nil } func (daemon *Daemon) getNetworkStats(c *container.Container) (map[string]types.NetworkStats, error) { sandboxID, err := daemon.getNetworkSandboxID(c) if err != nil { return nil, err } sb, err := daemon.netController.SandboxByID(sandboxID) if err != nil { return nil, err } lnstats, err := sb.Statistics() if err != nil { return nil, err } stats := make(map[string]types.NetworkStats) // Convert libnetwork nw stats into api stats for ifName, ifStats := range lnstats { stats[ifName] = types.NetworkStats{ RxBytes: ifStats.RxBytes, RxPackets: ifStats.RxPackets, RxErrors: ifStats.RxErrors, RxDropped: ifStats.RxDropped, TxBytes: ifStats.TxBytes, TxPackets: ifStats.TxPackets, TxErrors: ifStats.TxErrors, TxDropped: ifStats.TxDropped, } } return stats, nil }