在 docker 容器中构建比在根系统上慢得多

jre*_*enk 6 go docker

我正在尝试使用以下命令构建 go 包:

CGO_ENABLED=0 GOOS=linux go build -o bin/router -installsuffix cgo -ldflags '-w'
Run Code Online (Sandbox Code Playgroud)

在我的电脑上,这大约需要 0.5 秒。在 docker 容器中执行相同的命令需要 45 秒。

RUN CGO_ENABLED=0 GOOS=linux go build -o /app/router -installsuffix cgo -ldflags '-w' /build/src/global/router
Run Code Online (Sandbox Code Playgroud)

本地我有 go 版本1.12.9 linux/amd64。docker 容器使用golang:1.13镜像作为基础。

我的猜测是,docker 构建过程的可用 CPU 较少,但这会产生这么大的差异吗?导致此问题的原因可能是什么?

这可以用一个最小的例子来重现:

main.go:

package main

import "log"

func main() {
    log.Println("test")
}
Run Code Online (Sandbox Code Playgroud)

Dockerfile:

FROM golang:1.13

ADD main.go .

RUN CGO_ENABLED=0 GOOS=linux go build -o main -installsuffix cgo -ldflags '-w'

CMD [ "main" ]
Run Code Online (Sandbox Code Playgroud)

docker 容器内的命令大约需要 5 秒,而我的电脑上则需要不到 0.1 秒。

小智 3

在我看来,问题不在于容器本身。

$ go clean
$ time GO_ENABLED=0 GOOS=linux go build -o main -installsuffix cgo -ldflags '-w'

real    0m0,233s
user    0m0,278s
sys 0m0,094s

$ time GO_ENABLED=0 GOOS=linux go build -o main -installsuffix cgo -ldflags '-w'

real    0m0,076s
user    0m0,098s
sys 0m0,053s

$ go clean
$ time GO_ENABLED=0 GOOS=linux go build -o main -installsuffix cgo -ldflags '-w'

real    0m0,238s
user    0m0,315s
sys 0m0,070s
Run Code Online (Sandbox Code Playgroud)

您可以在比较连续构建中看到“清理”之后构建所需的时间。

概要 go clean [-i] [-r] [-n] [-x] [ 包 ]

描述 清洁

从包源目录中删除目标文件。go 命令在临时目录中构建大多数对象,因此 go clean 主要关注其他工具或手动调用 go build 留下的对象文件。

https://manpages.debian.org/testing/golang-go/go-clean.1.en.html

每次尝试在计算机上构建时,您是否都会清除构建文件夹?