这是因为您需要本机(C/C++)librdkafka.依赖项才能构建它.这意味着在大多数情况下也有gcc
个可用的.这是您的代码使用的底层Kakfa库.
您还需要让Go Build意识到这一点.我已经在您的示例中添加并修改了这两行代码,并且能够构建它.
# Add this
RUN apk add alpine-sdk
# Change this
RUN GOOS=linux GOARCH=amd64 go build -tags musl -o /app/bin/main .
功能示例:
FROM golang:1.20.2-alpine3.16 AS builder
RUN apk add alpine-sdk
RUN apk --update add git
WORKDIR /app
COPY . .
RUN go mod download
RUN GOOS=linux GOARCH=amd64 go build -tags musl -o /app/bin/main .
FROM scratch
WORKDIR /app
COPY --from=builder /app/bin/main /app/bin/main
ENTRYPOINT ["/app/bin/main"]
我已经使用了this quickstart个代码,构建过程还可以.
更新
为了避免链接,您可以采取一种不同的方法,通过在构建参数中进行一些更改来内联编译该库.
RUN git clone https://github.com/confluentinc/librdkafka.git && cd librdkafka && ./configure --prefix /usr && make && make install
我已经改编了this example:
FROM golang:1.20.2-alpine3.16 AS builder
ENV PATH="/go/bin:${PATH}"
ENV GO111MODULE=on
ENV CGO_ENABLED=1
ENV GOOS=linux
ENV GOARCH=amd64
WORKDIR /go/src
COPY go.mod .
COPY go.sum .
RUN go mod download
RUN apk -U add ca-certificates
RUN apk update && apk upgrade && apk add pkgconf git bash build-base sudo
RUN git clone https://github.com/confluentinc/librdkafka.git && cd librdkafka && ./configure --prefix /usr && make && make install
COPY . .
RUN go build -tags musl --ldflags "-extldflags -static" -o main .
FROM scratch AS runner
COPY --from=builder /go/src/main /
ENTRYPOINT ["./main"]
Kafka代码的执行似乎运行得很好,尽管我没有运行集成的实例.如果这不起作用,我将在这里创建一个用于测试的集群.这里的图像占用空间为8.9MB.