docker - undefined reference - 使用 Docker 构建 Golang CGO 失败,但在主机上失败

标签 docker go 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"]

两者都会产生以下构建日志:

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 之外运行得很好,而且我在lilliput 存储库。

最佳答案

alpine docker 镜像是一个简约的 Linux 版本 - 使用 musl-libc而不是 glibc - 通常用于构建微型图像。

要获得功能更丰富的 glibc - 并解决缺少的 CGO 依赖项 - 使用 golang Docker 镜像的非 alpine 版本建立你的 Assets :

#FROM golang:1.14.4-alpine AS build
#RUN apk add build-base

FROM golang:1.14.4 AS build

关于docker - undefined reference - 使用 Docker 构建 Golang CGO 失败,但在主机上失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64413161/

相关文章:

ruby-on-rails - Docker:在$ PATH中找不到Rails可执行文件

css - go buffalo 工作流程中生成的/public/assets 在哪里?

multithreading - 是否应该在长时间运行的进程中留下空闲线程?

go - libswscale bad dst 图像指针 cgo

docker - 如何在docker-compose文件中获取随机服务端口并将其设置为env var?

java - 使用 Java 向 Docker 容器发送 'exec' 命令

Go worker 池同时限制 goroutine 的数量和计算超时

windows - 加载dll失败。找不到指定的模块

c - 如何与CGO达成共识?

session - 在 docker 上运行时未定义节点 JS 快速 session ,但在 MAC 上运行良好