3 回答
TA贡献1942条经验 获得超3个赞
默认情况下,如果使用net
包,构建可能会生成一个带有一些动态链接的二进制文件,例如到 libc。您可以通过查看结果来动态检查与静态链接ldd output.bin
我遇到过两种解决方案:
禁用 CGO,通过
CGO_ENABLED=0
强制使用网络依赖的 Go 实现,netgo via
go build -tags netgo -a -v
,这是针对特定平台实现的
来自https://golang.org/doc/go1.2:
net 包默认需要 cgo,因为主机操作系统通常必须调解网络调用设置。但是,在某些系统上,可以在没有 cgo 的情况下使用网络,这样做很有用,例如避免动态链接。新的构建标记 netgo(默认关闭)允许在可能的情况下在纯 Go 中构建 net 包。
以上假设唯一的 CGO 依赖项是标准库的net
包。
TA贡献1934条经验 获得超2个赞
我在使用 go 二进制文件时遇到了同样的问题,在将它添加到我的 docker 文件后我让它工作了:
RUN apk add --no-cache libc6-compat
TA贡献1826条经验 获得超6个赞
来自您的构建机器的 Go 编译器可能会将您的二进制文件与位于与 Alpine 不同位置的库链接。就我而言,它是在 /lib64 下使用依赖项编译的,但 Alpine 不使用该文件夹。
FROM alpine:edge AS build
RUN apk update
RUN apk upgrade
RUN apk add --update go=1.8.3-r0 gcc=6.3.0-r4 g++=6.3.0-r4
WORKDIR /app
ENV GOPATH /app
ADD src /app/src
RUN go get server # server is name of our application
RUN CGO_ENABLED=1 GOOS=linux go install -a server
FROM alpine:edge
WORKDIR /app
RUN cd /app
COPY --from=build /app/bin/server /app/bin/server
CMD ["bin/server"]
我正在撰写有关此问题的文章。您可以在http://kefblog.com/2017-07-04/Golang-ang-docker找到此解决方案的草稿。
- 3 回答
- 0 关注
- 390 浏览
添加回答
举报