Как подключиться к Confluent Cloud из контейнера Docker

#scala #docker #apache-kafka #confluent-platform

#scala #docker #apache-kafka #confluent-платформа

Вопрос:

Я настроил тему Kafka в Confluent cloud (https://confluent.cloud /) и может подключаться / отправлять сообщения к теме, используя приведенную ниже конфигурацию:

kafka-config.properties:

 # Kafka
ssl.endpoint.identification.algorithm=
bootstrap.servers=pkc-4yyd6.us-east1.gcp.confluent.cloud:9092
security.protocol=SASL_SSL
sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule   required username="uname" password="pwd";
sasl.mechanism=PLAIN
  

Подключаясь из контейнера docker, я получаю:

 Failed to produce: org.apache.kafka.common.errors.SslAuthenticationException: SSL handshake failed
  

Поиск в приведенной выше ошибке предполагает ssl.endpoint.identification.алгоритм = должен исправить

Вот мой файл Dockerfile:

 FROM ysihaoy/scala-play:2.12.2-2.6.0-sbt-0.13.15

COPY ["build.sbt", "/tmp/build/"]
COPY ["project/plugins.sbt", "project/build.properties", "/tmp/build/project/"]

COPY . /root/app/
WORKDIR /root/app

CMD ["sbt" , "run"]
  

Я создаю и запускаю контейнер с помощью:

 docker build -t kafkatest .
docker run -it kafkatest
  

Требуется ли дополнительная конфигурация для подключения к Confluent Kafka?

Я не получаю эту проблему при локальной сборке (не используя Docker).

Обновить:

Вот Scala src, который я использую для создания свойств:

   def buildProperties(): Properties = {

    val kafkaPropertiesFile = Source.fromResource("kafka-config.properties")

    val properties: Properties = new Properties
    properties.load(kafkaPropertiesFile.bufferedReader())
    properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer")
    properties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.connect.json.JsonSerializer")
    properties
  }
  

Обновление 2:

   def buildProperties(): Properties = {

    val kafkaPropertiesFile = Source.fromResource("kafka-config.properties")

    val properties: Properties = new Properties
    properties.load(kafkaPropertiesFile.bufferedReader())
    println("bootstrap.servers:" properties.get("bootstrap.servers"))

    properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer")
    properties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.connect.json.JsonSerializer")
    properties
  }
  

Свойство bootstrap.servers найдено, поэтому файл добавляется в контейнер.

Обновление3 :

 sasl.jaas.config:org.apache.kafka.common.security.plain.PlainLoginModule   required username="Q763KBPRI" password="bFehkfL/J6m8L2aukX A/L59LAYb/bWr"
  

Обновление4:

 docker run -it kafkatest --network host
  

возвращает ошибку:

 docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: "--network": executable file not found in $PATH": unknown.
  

Комментарии:

1. Не могли бы вы поделиться кодом, который вы используете для подключения к Kafka, пожалуйста

2. @RobinMoffatt пожалуйста, посмотрите Обновление вопроса

3. Вы копируете kafka-config.properties в docker image? Чтобы убедиться, что вы используете правильные свойства, можете ли вы выйти из системы в конце buildProperties функции?

4. @amorfis файл добавлен в образ docker — пожалуйста, смотрите Обновление.

5. ОК, круто, они выглядели слишком убедительно: D

Ответ №1:

Использование другого базового образа решило проблему, но я не уверен, какая разница вызывает разрешение. Вот мой обновленный файл Dockerfile:

 ARG OPENJDK_TAG=8u232
FROM openjdk:${OPENJDK_TAG}

ARG SBT_VERSION=1.4.1

# Install sbt
RUN 
  mkdir /working/ amp;amp; 
  cd /working/ amp;amp; 
  curl -L -o sbt-$SBT_VERSION.deb https://dl.bintray.com/sbt/debian/sbt-$SBT_VERSION.deb amp;amp; 
  dpkg -i sbt-$SBT_VERSION.deb amp;amp; 
  rm sbt-$SBT_VERSION.deb amp;amp; 
  apt-get update amp;amp; 
  apt-get install sbt amp;amp; 
  cd amp;amp; 
  rm -r /working/ amp;amp; 
  sbt sbtVersion

COPY ["build.sbt", "/tmp/build/"]
COPY ["project/plugins.sbt", "project/build.properties", "/tmp/build/project/"]

COPY . /root/app/
WORKDIR /root/app

CMD ["sbt" , "run"]