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 mod
和 CGO
的项目,它有一个相对较大的依赖树。
本地构建(GOOS=linux
,GOARCH=amd64
)工作正常。
使用我的自定义构建容器(包括 arm
在内的几种架构)在 CI(在我自己的运行器上)中构建大部分都可以,尽管我有时会在 go get
ting 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