为了账号安全,请及时绑定邮箱和手机立即绑定

未定义的引用 - Golang CGO 构建使用 Docker 失败,但在主机上没有

未定义的引用 - Golang CGO 构建使用 Docker 失败,但在主机上没有

Go
慕仙森 2022-07-11 14:40:10
我正在尝试将lilliput库用于 Go。它只能在 Linux 和 OS X 上运行。在我的 Linux (Debian 10.3) 主机以及我的 WSL2 设置 (Ubuntu 20.04.1) 上,我运行和构建我的代码没有问题(摘录如下)。// main.gopackage mainimport (    "github.com/discordapp/lilliput")func main() {    ...    decoder, err := lilliput.NewDecoder(data)    ...}但是,当我尝试将其放入 Docker 容器中时,使用以下配置,它无法构建。# Dockerfile v1FROM golang:1.14.4-alpine AS buildRUN apk add build-baseWORKDIR /srcENV CGO_ENABLED=1COPY go.mod .COPY go.sum .RUN go mod downloadCOPY . .RUN go build -o /out/api .ENTRYPOINT ["/out/api"]EXPOSE 8080我已经尝试使用不同的方法调整 Dockerfile,例如:FROM alpine:edge AS buildRUN apk updateRUN apk upgradeRUN apk add --update go=1.15.3-r0 gcc=10.2.0-r5 g++=10.2.0-r5WORKDIR /appRUN go envENV GOPATH /appADD . /app/srcWORKDIR /app/srcRUN go get -d -vRUN CGO_ENABLED=1 GOOS=linux go build -o /app/bin/serverFROM alpine:edgeWORKDIR /appRUN cd /appCOPY --from=build /app/bin/server /app/bin/serverCMD ["bin/server"]两者都会导致以下构建日志:https://pastebin.com/zMEbEac3为了完整起见,go env主机的 。GOARCH="amd64"GOBIN=""GOCACHE="/home/kingofdog/.cache/go-build"GOEXE=""GOFLAGS=""GOHOSTARCH="amd64"GOHOSTOS="linux"GOOS="linux"GOPATH="/home/kingofdog/go"GOPROXY=""GORACE=""GOROOT="/usr/lib/go-1.11"GOTMPDIR=""GOTOOLDIR="/usr/lib/go-1.11/pkg/tool/linux_amd64"GCCGO="gccgo"CC="gcc"CXX="g++"CGO_ENABLED="1"GOMOD="/home/kingofdog/{PROJECT FOLDER}/go.mod"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-build589460337=/tmp/go-build -gno-record-gcc-switches"我已经在网上搜索过这个错误,但我能找到的都是其他人在他们的 Go 项目中导入 C 库的方式中的错误。然而,就我而言,我很确定这不是源代码的错误,而是 docker 容器的配置错误,因为代码本身在 Docker 之外运行良好,我在小人国存储库。
查看完整描述

2 回答

?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

dockeralpine镜像是一个简约的 Linux 版本 - 使用musl-libc代替glibc- 并且通常用于构建微小的镜像。


要获得更多功能glibc- 并解决您缺少CGO的依赖项 - 使用 Docker 映像的非高山版本golang来构建您的资产:


#FROM golang:1.14.4-alpine AS build

#RUN apk add build-base


FROM golang:1.14.4 AS build


查看完整回答
反对 回复 2022-07-11
?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

您是否构建了依赖项?

您必须运行脚本才能在 Linux 上构建依赖项。脚本:https ://github.com/discord/lilliput/blob/master/deps/build-deps-linux.sh

他们的文件提到:

建立依赖关系

Go 不提供任何用于任意构建依赖项的机制,例如调用 make 或 cmake。为了使 lilliput 可用作标准 Go 包,已为 lilliput 在 Linux 和 OSX 上的所有依赖项提供了预构建的静态库。为了自动化这个过程,lilliput 附带了构建脚本以及其依赖源的压缩档案。这些构建脚本是为 OSX 和 Linux 提供的。

如果它仍然失败,那么问题可能与问题有关,glibc-musl因为 alpine 图像有musl libc而不是glibc(GNU 的 libc)。因此,您可以尝试使用 Ubuntu/CentOS/等。最小的图像或找到一种glibc上高山的方法。


查看完整回答
反对 回复 2022-07-11
  • 2 回答
  • 0 关注
  • 134 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信