소스 검색

Endpoint interface stats read fails when invoked from docker

- When invoked from docker, endpoint.Statistics() returns
  the statistics of the host's interfaces.

  Issue is tracked down to ioutil.ReadFile(). For some
  reason even if invoked from inside the sandbox netns,
  it ends up reading the stats file from the default netns,
  when invoked from docker.
  If same operation is run from inside a dedicated binary,
  it works as expected.

- Replacing it with exec.Command("cat", <file>) solves the issue

Signed-off-by: Alessandro Boch <aboch@docker.com>
Alessandro Boch 10 년 전
부모
커밋
a3879fc169
1개의 변경된 파일6개의 추가작업 그리고 3개의 파일을 삭제
  1. 6 3
      libnetwork/sandbox/interface_linux.go

+ 6 - 3
libnetwork/sandbox/interface_linux.go

@@ -2,8 +2,8 @@ package sandbox
 
 import (
 	"fmt"
-	"io/ioutil"
 	"net"
+	"os/exec"
 	"regexp"
 	"sync"
 
@@ -168,9 +168,12 @@ func (i *nwIface) Statistics() (*InterfaceStatistics, error) {
 	s := &InterfaceStatistics{}
 
 	err := nsInvoke(path, func(nsFD int) error { return nil }, func(callerFD int) error {
-		data, err := ioutil.ReadFile(netStatsFile)
+		// For some reason ioutil.ReadFile(netStatsFile) reads the file in
+		// the default netns when this code is invoked from docker.
+		// Executing "cat <netStatsFile>" works as expected.
+		data, err := exec.Command("cat", netStatsFile).Output()
 		if err != nil {
-			return fmt.Errorf("failed to open %s: %v", netStatsFile, err)
+			return fmt.Errorf("failure opening %s: %v", netStatsFile, err)
 		}
 		return scanInterfaceStats(string(data), i.DstName(), s)
 	})