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

我正在尝试将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"]

两者都会导致以下构建日志:


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 之外运行良好,我在小人国存储库。


慕仙森
浏览 135回答 2
2回答

小怪兽爱吃肉

dockeralpine镜像是一个简约的 Linux 版本 - 使用musl-libc代替glibc- 并且通常用于构建微小的镜像。要获得更多功能glibc- 并解决您缺少CGO的依赖项 - 使用 Docker 映像的非高山版本golang来构建您的资产:#FROM golang:1.14.4-alpine AS build#RUN apk add build-baseFROM 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因为 alpine 图像有musl libc而不是glibc(GNU 的 libc)。因此,您可以尝试使用 Ubuntu/CentOS/等。最小的图像或找到一种glibc上高山的方法。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go