登录
首页 >  Golang >  Go问答

在 Docker 容器中构建比在宿主系统上慢得多

来源:stackoverflow

时间:2024-03-13 20:27:26 221浏览 收藏

本篇文章主要是结合我之前面试的各种经历和实战开发中遇到的问题解决经验整理的,希望这篇《在 Docker 容器中构建比在宿主系统上慢得多》对你有很大帮助!欢迎收藏,分享给更多的需要的朋友学习~

问题内容

我正在尝试使用以下命令构建一个 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 版本 1.12.9 linux/amd64。 docker 容器使用 golang:1.13 映像作为基础。

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

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

main.go

package main

import "log"

func main() {
    log.println("test")
}

dockerfile

FROM golang:1.13

ADD main.go .

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

CMD [ "main" ]

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

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

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

描述干净

从包源目录中删除目标文件。执行命令 在临时目录中构建大部分对象,所以 go clean 主要是 与其他工具或手动留下的目标文件有关 调用 go build。

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

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

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《在 Docker 容器中构建比在宿主系统上慢得多》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>