【问题标题】:Docker build fails due to kafka undefined error由于 kafka 未定义错误,Docker 构建失败
【发布时间】:2022-03-17 06:07:22
【问题描述】:

当我尝试构建我们的 go 应用程序时,我们收到以下错误。

=> ERROR [builder 7/7] RUN CGO_ENABLED=0 GOOS=linux go build -o myapp
 > [builder 7/7] RUN CGO_ENABLED=0 GOOS=linux go build -o myapp:
#14 6.962 # main
#14 6.962 ./kafkaproducer.go:12:12: undefined: kafka.NewProducer
#14 6.962 ./kafkaproducer.go:12:31: undefined: kafka.ConfigMap
#14 6.962 ./kafkaproducer.go:23:10: undefined: kafka.Message
#14 6.962 ./kafkaproducer.go:39:13: undefined: kafka.Message

我的 Docker 文件是

FROM golang:1.16-alpine AS builder
RUN mkdir /app
ADD . /app
WORKDIR /app
RUN go mod tidy
RUN CGO_ENABLED=0 GOOS=linux go build -o myapp
FROM busybox AS prod
COPY --from=builder /app .
CMD ["./myapp"]

在我的 kafkaProducer go 文件中,我正在导入这个

import (
    "fmt"
    "log"

    "github.com/confluentinc/confluent-kafka-go/kafka"
)

我的应用程序在本地构建时构建成功,但通过 docker build 失败,因为它无法下载 kafka 依赖项并抛出未定义的错误。 请帮我解决这个问题

【问题讨论】:

    标签: docker go apache-kafka dockerfile confluent-platform


    【解决方案1】:

    所以在构建时这似乎取决于 cgo。我设法通过使用 cgo 编译解决了这个问题,但静态链接了依赖项。

    FROM golang AS builder
    
    WORKDIR /app
    COPY . .
    RUN go mod download && \
        go build -o myapp -ldflags '-linkmode external -w -extldflags "-static"'
    
    
    # works also with alpine
    FROM busybox 
    
    COPY --from=builder /app/myapp myapp
    CMD ["./myapp"]
    

    我使用下面的代码from their repo 进行测试。这最初给了我你所显示的那种错误。

    package main
    
    import (
        "fmt"
    
        "github.com/confluentinc/confluent-kafka-go/kafka"
    )
    
    func main() {
    
        p, err := kafka.NewProducer(&kafka.ConfigMap{"bootstrap.servers": "localhost"})
        if err != nil {
            panic(err)
        }
    
        defer p.Close()
    
        // Delivery report handler for produced messages
        go func() {
            for e := range p.Events() {
                switch ev := e.(type) {
                case *kafka.Message:
                    if ev.TopicPartition.Error != nil {
                        fmt.Printf("Delivery failed: %v\n", ev.TopicPartition)
                    } else {
                        fmt.Printf("Delivered message to %v\n", ev.TopicPartition)
                    }
                }
            }
        }()
    
        // Produce messages to topic (asynchronously)
        topic := "myTopic"
        for _, word := range []string{"Welcome", "to", "the", "Confluent", "Kafka", "Golang", "client"} {
            p.Produce(&kafka.Message{
                TopicPartition: kafka.TopicPartition{Topic: &topic, Partition: kafka.PartitionAny},
                Value:          []byte(word),
            }, nil)
        }
    
        // Wait for message deliveries before shutting down
        p.Flush(15 * 1000)
    }
    

    【讨论】:

    • 嗨,我在我的 docker 文件中使用了这个 RUN CGO_ENABLED=0 GOOS=linux go build -a -tags musl -ldflags '-linkmode external -w -extldflags "-static"' -o myapp .go .... 如果我不使用 CGO_ENABLED=0 或将其保留为 CGO_ENABLED=1 ,则 kafka 未定义错误消失了,但随后又出现另一个错误,即 standard_init_linux.go:228: exec user process caused: no such file or directory ,你能帮我解决这个问题吗
    猜你喜欢
    • 2022-11-02
    • 1970-01-01
    • 1970-01-01
    • 2021-07-02
    • 2019-11-13
    • 2021-10-20
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    相关资源
    最近更新 更多