如何解决未定义的参考-使用Docker进行Golang CGO构建失败,但是在主机上却没有
我正在尝试将lilliput库用于Go。它只能在Linux和OS X上运行。
在我的Linux(Debian 10.3)主机和WSL2设置(Ubuntu 20.04.1)上,运行和构建我的代码都没有问题(以下摘录)。
// main.go
package main
import (
"github.com/discordapp/lilliput"
)
func main() {
...
decoder,err := lilliput.NewDecoder(data)
...
}
但是,当我尝试将其放入具有以下配置的Docker容器中时,它无法构建。
# Dockerfile v1
FROM golang:1.14.4-alpine AS build
RUN apk add build-base
WORKDIR /src
ENV CGO_ENABLED=1
COPY go.mod .
COPY go.sum .
RUN go mod download
COPY . .
RUN go build -o /out/api .
ENTRYPOINT ["/out/api"]
EXPOSE 8080
我已经尝试使用不同的方法来调整Dockerfile,例如:
FROM alpine:edge AS build
RUN apk update
RUN apk upgrade
RUN apk add --update go=1.15.3-r0 gcc=10.2.0-r5 g++=10.2.0-r5
WORKDIR /app
RUN go env
ENV GOPATH /app
ADD . /app/src
WORKDIR /app/src
RUN go get -d -v
RUN CGO_ENABLED=1 GOOS=linux go build -o /app/bin/server
FROM alpine:edge
WORKDIR /app
RUN cd /app
COPY --from=build /app/bin/server /app/bin/server
CMD ["bin/server"]
两者都导致以下构建日志:
为完整性起见,请使用主机的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外部运行良好,并且我在Docker上找不到类似的问题小人区仓库。
解决方法
alpine
泊坞窗映像是一个简约的Linux版本-使用musl-libc而不是glibc
-通常用于构建微小映像。
要获得更具特色的glibc
-并解决缺失的CGO
依赖性-请使用golang
Docker映像的非高山版本来构建资产:
#FROM golang:1.14.4-alpine AS build
#RUN apk add build-base
FROM golang:1.14.4 AS build
,
您建立了依赖性吗?
您必须运行脚本以在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
链接,因为高山图像具有musl libc
而不是glibc
(GNU的libc)。因此,您可以尝试使用Ubuntu / CentOS / etc。最少的图像,或找到一种方法来使glibc
成为阿尔卑斯山脉的人。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。