docker容器中的Go build要比根系统上的慢得多
我正在尝试使用以下命令构建go包: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
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