首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未定义的引用- Golang构建使用Docker失败,但在主机上失败

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

Stack Overflow用户
提问于 2020-10-18 12:14:55
回答 2查看 2.9K关注 0票数 2

我正在尝试使用利利普特库。它只能在Linux和OS上运行。

在我的Linux (Debian10.3)主机和我的WSL2安装程序(Ubuntu20.04.1)上,我在运行和构建我的代码(摘录如下)时没有问题。

代码语言:javascript
复制
// main.go
package main

import (
    "github.com/discordapp/lilliput"
)

func main() {
    ...
    decoder, err := lilliput.NewDecoder(data)
    ...
}

但是,当我尝试将其放入Docker容器中时,使用下面的配置,它将无法生成。

代码语言:javascript
复制
# 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,例如:

代码语言:javascript
复制
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

代码语言:javascript
复制
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之外运行得非常好,而且我在lilliput存储库上也找不到类似的问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-10-18 12:41:51

alpine坞映像是一个极简式的Linux版本--使用musl-libc而不是glibc --通常用于构建微小的映像。

要获得更有特色的glibc (并解决丢失的CGO依赖关系),请使用非高寒版本的golang Docker映像来构建您的资产:

代码语言:javascript
复制
#FROM golang:1.14.4-alpine AS build
#RUN apk add build-base

FROM golang:1.14.4 AS build
票数 3
EN

Stack Overflow用户

发布于 2020-10-18 12:41:41

您构建了依赖关系吗?

必须运行脚本才能在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/等最小图像,或者找到一种在高山上获取glibc的方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64413161

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档