docker容器中的Go build要比根系统上的慢得多

docker容器中的Go build要比根系统上的慢得多,docker,go,Docker,Go,我正在尝试使用以下命令构建go包: CGO_ENABLED=0 GOOS=linux go build -o bin/router -installsuffix cgo -ldflags '-w' 在我的电脑上这大约需要0.5秒。在docker容器中执行相同的命令需要45秒 RUN CGO_ENABLED=0 GOOS=linux go build -o /app/router -installsuffix cgo -ldflags '-w' /build/src/global/router

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

CGO_ENABLED=0 GOOS=linux go build -o bin/router -installsuffix cgo -ldflags '-w'
在我的电脑上这大约需要0.5秒。在docker容器中执行相同的命令需要45秒

RUN CGO_ENABLED=0 GOOS=linux go build -o /app/router -installsuffix cgo -ldflags '-w' /build/src/global/router
在本地,我使用的是1.12.9Linux/amd64版本。docker容器使用golang:1.13图像作为基础

我的猜测是docker构建过程的可用CPU更少,但这会造成这么大的差异吗?这个问题的原因可能是什么

这可以通过一个简单的示例进行复制:

main.go:

Dockerfile:


docker容器内的命令大约需要5秒,而我的电脑上的时间小于0.1秒。

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

$ 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
您可以在comparation Concertives build(比较连续构建)中看到构建在“清理”之后所花费的时间

内容提要清理[-i][r][n][x][packages]

描述干净

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


在每次尝试在您的计算机上生成时,您是否正在清除生成文件夹?

您的应用程序是否具有库依赖关系?是否每个docker build命令都需要下载它们,但您的本地版本已经缓存了它们?我使用的是go mod,所有依赖项都缓存在docker文件的上一个构建步骤中。您的意思是您有一个docker build多步骤?问题是CGO_已启用,你的机器正在缓存,而Docker没有。我也试着运行go build-o/app/router/build/src/global/router这使它更快,但仍然需要30秒。build-on-container的问题是容器在每个构建之间没有保持状态。我还认为问题是每次go-build步骤时,go-cache目录都不存在在docker容器中执行。现在的问题是docker中是否有解决方案。你能以某种方式保留构建缓存吗?根据我的经验,如果问题是下载外部资源的时间,也许是的。但我不认为缓存构建本身遵循docker filosofy。无论如何,我建议您创建一个多步骤docker文件来分隔运行的构建。
FROM golang:1.13

ADD main.go .

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

CMD [ "main" ]
$ 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