我正在尝试使用利利普特库。它只能在Linux和OS上运行。
在我的Linux (Debian10.3)主机和我的WSL2安装程序(Ubuntu20.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之外运行得非常好,而且我在lilliput存储库上也找不到类似的问题。
发布于 2020-10-18 12:41:51
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发布于 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的方法。
https://stackoverflow.com/questions/64413161
复制相似问题