这是我用来构建Golang应用程序和工作的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,因为worker中的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
有人能提出这里出了什么问题以及解决方案吗?
我在工人中使用了合流卡夫卡,这可能是这个错误的原因。
有人能提出这里出了什么问题以及解决方案吗?
你在这里做什么:
RUN ln -s /lib/libc.musl-x86_64.so.1 /lib/ld-linux-x86-64.so.2
是假装Musl是GLIBC。事实并非如此,也不起作用。
来自Musl常见问题解答:
二进制兼容性要有限得多,但随着musl的新版本,它将稳步增加。目前,一些glibc链接的共享库可以用musl加载,但如果用musl代替
/lib/ld-linux.so.2
,则除最简单的glibc链接应用程序外,其他所有应用程序都将失败。
与其针对GLIBC构建worker
二进制文件,然后尝试使用Musl运行它,不如针对Musl构建它。