我的kafka流应用程序与docker不兼容

我的kafka流应用程序与docker不兼容,docker,apache-kafka,apache-kafka-streams,Docker,Apache Kafka,Apache Kafka Streams,我有一个kafka集群,当我在上面运行我的jar时,它可以正常工作,但是如果我用我的jar创建了一个docker,docker的创建是正确的,但是当我启动它时,它根本不工作: FROM openjdk:8-jre-alpine RUN mkdir -p /opt/app WORKDIR /opt/app COPY ./run_jar.sh ./*.jar ./ RUN chmod +x ./run_jar.sh ENTRYPOINT ["./run_jar.sh"] 我做了以下动作 docke

我有一个kafka集群,当我在上面运行我的jar时,它可以正常工作,但是如果我用我的jar创建了一个docker,docker的创建是正确的,但是当我启动它时,它根本不工作:

FROM openjdk:8-jre-alpine
RUN mkdir -p /opt/app
WORKDIR /opt/app
COPY ./run_jar.sh ./*.jar ./
RUN chmod +x ./run_jar.sh
ENTRYPOINT ["./run_jar.sh"]
我做了以下动作

docker build -t kafkapp:0.1 .
docker run --rm --name consumer-1 -it kafkapp:0.1

这是我的卡夫卡

import java.time.Duration
import java.util.Properties

import io.confluent.kafka.streams.serdes.avro.GenericAvroSerde
import org.apache.avro.generic.GenericRecord
import org.apache.kafka.clients.consumer.ConsumerConfig
import org.apache.kafka.common.serialization.Serdes
import org.apache.kafka.streams.kstream.{Consumed, Printed, Produced}
import org.apache.kafka.streams.scala._
import org.apache.kafka.streams.scala.kstream.KStream
import org.apache.kafka.streams.{KafkaStreams, StreamsConfig}

import scala.collection.JavaConverters._


object CustumerAvroStream extends App {

    val props = new Properties()
    props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092")
    props.put(ConsumerConfig.GROUP_ID_CONFIG, "group1")
    props.put(StreamsConfig.APPLICATION_ID_CONFIG, "kafka-connect")
    props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer")
    props.put("value.deserializer", "io.confluent.kafka.serializers.KafkaAvroDeserializer")
//  props.put("schema.registry.url", "http://localhost:8081")

     val config = Map("schema.registry.url" -> "http://localhost:8081").asJava

    implicit def stringSerde = Serdes.String()
    val avroSerde = new GenericAvroSerde {configure(config, false)}
    implicit val consumer = Consumed.`with`(Serdes.String, avroSerde)
    implicit  val producer = Produced.`with`(Serdes.String, avroSerde)

    val builder = new StreamsBuilder()

    val personStream: KStream[String, GenericRecord] = builder.stream("topicperson")

    personStream.to("personSink")


    val sysout = Printed
        .toSysOut[String, GenericRecord]
        .withLabel("customerStream")
    personStream.print(sysout)


    val streams: KafkaStreams = new KafkaStreams(builder.build(), props)

    streams.cleanUp()

    streams.start()

    // Add shutdown hook to respond to SIGTERM and gracefully close Kafka Streams
    sys.ShutdownHookThread {
        streams.close(Duration.ofSeconds(5))

    }

}


您能帮我找到解决方案吗?

请显示您的Kafka Streams代码。首先,您可能需要为Kafka公开一些端口。我使用了
RabbitMQ
,所以我只是猜测端口,需要进行身份验证。在RabbitMQ中,您可以使用来宾凭据登录到localhost。但是任何东西都需要不同的用户名和密码。其次,如果您
docker运行-it--rm--name consumer-1-it-kafkapp:0.1/bin/bash
,您可以登录到您的docker并四处查看,看看是否一切都在其预期的位置。看一看,然后让我知道!还有,为什么不直接使用?不确定
run_jar.sh
是什么,但您的Dockerfile似乎非常小,依赖项为0。还要注意,
run mkdir-p/opt/app
行是不需要的(因为
WORKDIR/opt/app
可以被视为与
mkdir-p/opt/app&&cd/opt/app
等效的Dockerfile)@DuDoff这个问题听起来像是他试图运行Kafka消费者(客户端,从主题中读取消息)而不是代理(服务器),所以发布端口应该是不必要的。