在我安装的alpine:edge
容器中,通过
RUN apk add --no-cache musl-dev go
然后我尝试运行go get github.com/golang/protobuf/protoc-gen-go
。
这将导致错误消息:
go: finding github.com/golang/protobuf/protoc-gen-go latest
go: finding github.com/golang/protobuf v1.3.1
go: downloading github.com/golang/protobuf v1.3.1
go: extracting github.com/golang/protobuf v1.3.1
# github.com/golang/protobuf/protoc-gen-go
loadinternal: cannot find runtime/cgo
protoc-gen-go: program not found or is not executable
现在查看代码,它在ctxt.PackageFile[name]
上失败。
不过,我再次检查了/usr/lib/go/pkg/tool/linux_amd64/cgo
和/usr/lib/go/pkg/linux_amd64/runtime/cgo.a
都存在。
应该按照go env
的顺序排列:
GOARCH="amd64"
GOBIN=""
GOCACHE="/root/.cache/go-build"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="linux"
GOPATH="/root/go"
GOPROXY=""
GORACE=""
GOROOT="/usr/lib/go"
GOTMPDIR=""
GOTOOLDIR="/usr/lib/go/pkg/tool/linux_amd64"
GCCGO="gccgo"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD="/dev/null"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build521273293=/tmp/go-build -gno-record-gcc-switches"
有人提示下一个地方在哪里或有什么问题吗?
答案 0 :(得分:0)
目前,作为一种解决方法,我将必要的Go二进制文件从golang:1.12-alpine
复制到当前容器中。
有了这个,go get
就会按预期工作。
答案 1 :(得分:0)
避免此问题的一种方法是强制静态构建禁用cgo
。尝试使用以下命令构建二进制文件:
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o yourBinaryName
如果您的应用程序中确实需要cgo,则可能需要安装gcc,musl-dev甚至是@abergmeier指出的build-base。 您可以使用以下命令执行此操作:
RUN apk update && apk add --no-cache musl-dev gcc build-base
如果这些都不起作用,我会检查这个要点,声称它创建了一个能够编译原型的Dockerfile:"Alpine (3.6) based docker image with Protocol Buffers compiler supporting Go"
答案 2 :(得分:0)
变通办法正确的解决方案是安装go
编译器实际上正在寻找的内容.
错误:
<块引用>找不到运行时/cgo
基本上在高层次上意味着它无法在您的系统上找到必要的库和头文件来链接任何 C 代码或 C 库。
在这种情况下,只需安装它正在寻找的 libc-dev
:
$ apk --no-cache -U add libc-dev
或者,如果愿意,只需安装元软件包 build-base
:
$ apk --no-cache -U add build-base