【发布时间】: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 库,可能会导致这样的不兼容性。您可以使用
debian或ubuntu图像作为最终阶段的基础,还是使用基于Alpine 的构建器阶段? -
我的目标是使最终构建大小低于 100 MB。有了这个 docker 文件,它的大小约为 80 MB。如果我转向基于 Debian 的映像,它大约有 200 MB。
标签: docker go alpine-linux libc