go container build (arm) with CGO timeout with net/http: TLS 握手超时

Posted

技术标签:

【中文标题】go container build (arm) with CGO timeout with net/http: TLS 握手超时【英文标题】:go container build (arm) with CGO timeout with net/http: TLS handshake timeout 【发布时间】:2022-01-14 08:55:17 【问题描述】:

我有一个使用 go modCGO 的项目,它有一个相对较大的依赖树。

本地构建(GOOS=linuxGOARCH=amd64)工作正常。 使用我的自定义构建容器(包括 arm 在内的几种架构)在 CI(在我自己的运行器上)中构建大部分都可以,尽管我有时会在 go getting deps 时“挂起”。

使用相同的构建映像为arm 本地构建(由于CGO 和相应的依赖于arch 的C 工具链,我需要使用容器)现在给我以下错误(其中一个示例):

go: downloading github.com/go-co-op/gocron v1.9.0
scheduler/scheduler.go:7:2: github.com/go-co-op/gocron@v1.9.0: Get "https://goproxy.io/github.com/go-co-op/gocron/@v/v1.9.0.zip": net/http: TLS handshake timeout

但是,我可以看到(使用btop)在此错误之前qemu-arm 非常忙(800 CPU%)运行go 相关的构建任务(实际上是go mod tidy 进程)。

我的猜测是,这是因为找不到适合 arm 的特定模块的二进制文件,所以它只会即时构建它们。

所以我怀疑从源代码构建各个模块的时间被 go get 计算为正常的“从 http 获取”,这会导致观察到的超时。

因此,这意味着如果我能够增加 go get 的超时值,我就可以解决问题,但我没有找到任何相关信息。

有什么想法吗?

【问题讨论】:

【参考方案1】:

您的 ISP 可能对访问 https://goproxy.io 地址有限制。您必须使用代理

在终端中设置代理,如:

export https_proxy=127.0.0.1:1080

【讨论】:

CI 主机在 LAN 内运行,因此从 ISP 的角度来看,我的本地(开发)主机和 gitlab-runner(只是我 LAN 中的另一台服务器)之间没有区别。超时始终只发生在 arm 构建上,这涉及比我的原生架构更繁重的编译任务。

以上是关于go container build (arm) with CGO timeout with net/http: TLS 握手超时的主要内容,如果未能解决你的问题,请参考以下文章

解决 genymotion 安装apk报错 app contains ARM native code and your Genymotion device cannot run ARM instruc

为 ARM 交叉编译 opencv 项目并在 go 项目 gocv 中调用

Go语言容器(container)

Go语言容器(container)

go build和go install的区别

转: 通过不到100行Go代码打造你自己的容器