這是我用來構建 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,這可能是導致此錯誤的原因。
uj5u.com熱心網友回復:
有人可以建議這里出了什么問題并解決它嗎?
你在這里做什么:
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.
與其worker針對 GLIBC 構建二進制檔案,然后嘗試使用 Musl 運行它,不如針對 Musl 構建它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/513878.html
標籤:去dockerfile汇合平台alpine-linux库
