我在一个非常简单的消费者中使用"github.com/confluentinc/confluent-kafka-go/kafka".这几乎就是Confluent作为Kafka/Go教程所拥有的.

"go 建吧."和"go 跑吧"成功,"建造 docker ".不会的.

错误是:

 > [builder 7/7] RUN go build -o /app/bin/main .:
#12 9.826 # gitlab.com/.....
#12 9.826 ./main.go:24:24: undefined: kafka.ConfigMap
#12 9.826 ./main.go:30:18: undefined: kafka.NewConsumer

这是我的文档文件:

FROM golang:1.20.2-alpine3.16 AS builder
RUN apk --update add git
WORKDIR /app
COPY go.mod go.sum /app/
RUN go mod download
COPY . .
RUN go build -o /app/bin/main .

FROM scratch
WORKDIR /app
COPY --from=builder /app/bin/main /app/bin/main
ENTRYPOINT ["/app/bin/main"]

我不知道为什么会发生这种情况,特别是因为它声称包中的一些函数是未定义的.我在代码中的任何地方都没有重新声明"Kafka".

推荐答案

这是因为您需要本机(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.

Go相关问答推荐

如何在Deliverq中高效地传达客户依赖关系?

如何从google.golang.org/grpc/stats包中将golang中不同事件的输出进行组合,以获取func HandlePRC

为什么我不能使用Docker从本地访问我的Gin应用程序?

如何在GoFr中为生产和本地环境设置不同的配置?

Golang内置打印(Ln)函数&S行为怪异

Golang String

如何配置vscode以在Go中显示不必要的(过度指定的)泛型?

Go Gin:验证 base64

Go 中的sync.Cond 与 Wait 方法

通过 Terraform 中的 MapNestedAtribute 进行迭代

使用反射在Go中递归迭代 struct 体和集合字段

这是实现超时的常见方法,为什么 time.After 不起作用

如何在 Go msgraph-sdk-go 中转发消息并包括抄送和/或密送收件人?

如何使用 sync.WaitGroup 来执行所有的 goroutine?

如何在切片增长时自动将切片的新元素添加到函数参数

Go gmail api 快速入门导致本地主机拒绝连接 ERR_CONNECTION_REFUSED

如何使用struct的方法清除除某些字段之外的struct值

函数超时和 goroutine 泄漏

如何从 docker-compose 命令运行 2 个不同的命令:

Go 语言的select语句