【问题标题】:Alpine docker image __isnan: symbol not found高山泊坞窗图像 __isnan:找不到符号
【发布时间】:2022-10-13 02:33:57
【问题描述】:

这是我用来构建 Golang 应用程序和 worker 的 Dockerfile

FROM golang:1.15 AS build

RUN mkdir -p /go/api/proj

WORKDIR /go/api/proj

COPY go.* ./

RUN go mod download

COPY . .

RUN go mod tidy

RUN go build -o proj ./api/

RUN go build -o worker ./worker/

FROM alpine:3.14

WORKDIR /

RUN apk add libc6-compat cmake

RUN ln -s /lib/libc.musl-x86_64.so.1 /lib/ld-linux-x86-64.so.2

COPY . .

COPY --from=build /go/api/proj/proj .

COPY --from=build /go/api/proj/worker .

EXPOSE 80

CMD ["./worker"]

我不得不添加 libc6-compat 因为工人中的 kafka 设置与 alpine 的 musl 库不兼容

这是我尝试在 docker 容器中运行 worker 时收到的错误

Error relocating ./worker: __strdup: symbol not found
Error relocating ./worker: __isnan: symbol not found
Error relocating ./worker: __strndup: symbol not found

有人可以建议这里出了什么问题并解决它吗?

我在 worker 中使用 confluent kafka,这可能是导致此错误的原因。

【问题讨论】:

  • Alpine 有一个修改过的系统 C 库,可能会导致这样的不兼容性。您可以使用debianubuntu 图像作为最终阶段的基础,还是使用基于Alpine 的构建器阶段?
  • 我的目标是使最终构建大小低于 100 MB。有了这个 docker 文件,它的大小约为 80 MB。如果我转向基于 Debian 的映像,它大约有 200 MB。

标签: docker go alpine-linux libc


【解决方案1】:

有人可以建议这里出了什么问题并解决它吗?

你在这里做什么:

RUN ln -s /lib/libc.musl-x86_64.so.1 /lib/ld-linux-x86-64.so.2

假装Musl 是 GLIBC。不是,而且那是行不通的。

来自Musl FAQ

二进制兼容性受到更多限制,但随着新版本的 musl 会稳步增加。目前,一些 glibc 链接的共享库可以用 musl 加载,但如果将 musl 放入 /lib/ld-linux.so.2 的位置,除了最简单的 glibc 链接的应用程序之外的所有应用程序都会失败。

与其针对 GLIBC 构建 worker 二进制文件,然后尝试使用 Musl 运行它,不如针对 Musl 构建它。

【讨论】:

  • 非常感谢您的意见。最初我尝试只使用 musl,但由于一些 librdkafka 问题而失败。但是在阅读了您的评论后,我决定尝试一下,并通过添加这些库来工作:make gcc libtool musl-dev
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-02
  • 2019-09-19
  • 1970-01-01
  • 2017-05-06
  • 1970-01-01
  • 2021-04-29
  • 2018-12-15
相关资源
最近更新 更多