2017-10-25 3 views
1

공식 소스 코드 (내 호스트 컴퓨터는 Mac)를 컴파일하기 위해 공식 골란 고산 이미지를 사용하고 있습니다. 컨테이너 내부에 전체 $GOPATH을 마운트 할 때도 인식하지 못했습니다 이전 빌드의 캐시 된 데이터를 사용하십시오. $GOPATH/pkg 디렉토리에 생성했는지 확인했지만 후속 빌드 속도에는 영향을 미치지 않습니다. 시간이 주위에 남아Docker의 Golang 컴파일 캐시

다른 용기를 사용하여 28- : 나는 여러 컴파일 같은 용기를 재사용하는 경우

그러나, 캐시의 어떤 종류의 사용을하지, 당신은 내가 한이 실험의 결과를 볼 수 있습니다 각 빌드에서 30 대 :

$ rm -r $GOPATH/pkg/linux_amd64 
$ time docker run -v$GOPATH:/go -e CGO_ENABLED=0 golang:1.9-alpine3.6 go build -i github.com/myrepo/mypackage 
... 
0.02s user 0.08s system 0% cpu 30.914 total 

$ time docker run -v$GOPATH:/go -e CGO_ENABLED=0 golang:1.9-alpine3.6 go build -i github.com/myrepo/mypackage 
... 
0.02s user 0.07s system 0% cpu 28.128 total 

같은 컨테이너, 이후의 빌드를 재사용 훨씬 빠릅니다 :

$ rm -r $GOPATH/pkg/linux_amd64  
$ docker run -d -v$GOPATH:/go -e CGO_ENABLED=0 golang:1.9-alpine3.6 tail -f /dev/null 
bb4c08867bf2a28ad87facf00fa9dcf2800ad480fe1e66eb4d8a4947a6efec1d 

$ time docker exec bb4c08867bf2 go build -i github.com/myrepo/mypackage 
... 
0.02s user 0.05s system 0% cpu 27.028 total 

$ time docker exec bb4c08867bf2 go build -i github.com/myrepo/mypackage 
0.02s user 0.06s system 0% cpu 7.409 total 

밖으로 어떤 장소에서 캐시의 어떤 종류를 사용하여 이동인가 $GOPATH의?

+0

첫 번째 명령 집합에서 pkg 디렉토리를 재사용하지 않으며 src 만 사용하십시오. pkg에는 "캐시"가 들어 있습니다. – Peter

+0

죄송합니다. @Peter, 맞아요, 잘못된 예를 붙였습니다 (두 번째'rm' 명령이 실패했기 때문에 문제가 있음을 알았습니다). 결과는 $ GOPATH 폴더 전체와 동일한 마운팅 – colega

답변

0

golang 컨테이너 안에 빌드 할 때이 컨테이너 안에 $ GOPATH/pkg 디렉토리를 사용하고 있습니다.. 그런 다음 다른 golang 컨테이너를 시작하면 $ GOPATH/pkg가 비어 있습니다. 그러나 동일한 컨테이너 (exec 사용)를 계속 사용하면 $ GOPATH/pkg가 다시 사용됩니다.

rm -r $GOPATH/pkg/linux_amd64은 로컬 컴퓨터에서만이 디렉토리를 제거합니다. 그래서 이것은 아무런 효과가 없습니다.

가능한 대안은

  • 첫 번째 빌드 후 컨테이너를 저지 할 수있는 동일한 컨테이너를 사용하여 재, 또는
  • 는 호스트 시스템 또는 데이터에서 볼륨으로 $ GOPATH/PKG을 탑재 음량.
+0

마운트 중입니다. 컨테이너의 $ GOPATH에 대한 나의 로컬 $ GOPATH는 $ GOPATH/pkg를 포함하지 않아야합니까? 실제로 $ GOPATH/pkg/linux_amd64에있는 로컬 컴퓨터의 데이터는 Docker 컨테이너의 데이터입니다. (필자의 로컬 컴퓨터는 darwin_amd64입니다 – colega

0

컴파일 할 패키지를 인쇄하려면 -v 플래그를 사용하십시오. 이것은 시간 낭비보다 더 나은 지표 일 수 있습니다.

gopath를 볼륨으로 마운트하여 원하는 결과를 얻을 수있었습니다 (이전과 마찬가지로 작동해야합니다 ...). 아래의 스 니펫을 참조하십시오. 처음에는 두 패키지를 모두 컴파일합니다.

사이드 노트 :이 접근법에서 내가 가진 한 가지 문제점은 볼륨 디렉토리가 해당 디렉토리의 이미지에 이미있는 내용을 "덮어 씁니다"(즉, 그림자) 것입니다. 기본 골란 알파인 이미지 만 사용하는 것이 좋습니다./go는 비어 있어야하기 때문에.

pkm$ tree 
. 
└── src 
    └── github.com 
     ├── org1 
     │   └── mine 
     │    └── main.go 
     └── org2 
      └── somelib 
       └── lib.go 

6 directories, 2 files 
pkm$ docker run --rm -v $GOPATH:/go golang:1.9-alpine go build -i -v github.com/org1/mine 
github.com/org2/somelib 
github.com/org1/mine 
pkm$ tree 
. 
├── mine 
├── pkg 
│   └── linux_amd64 
│    └── github.com 
│     └── org2 
│      └── somelib.a 
└── src 
    └── github.com 
     ├── org1 
     │   └── mine 
     │    └── main.go 
     └── org2 
      └── somelib 
       └── lib.go 

10 directories, 4 files 
pkm$ docker run --rm -v $GOPATH:/go golang:1.9-alpine go build -i -v github.com/org1/mine 
github.com/org1/mine 
pkm$