Kafka 消费者应用程序无法使用 docker compose 连接 Azure eventhub,但使用 docker 可以正常工作

问题描述 投票:0回答:1

我有一个 Java 应用程序,使用 docker 可以正常工作。它使用来自 Azure EventHub 的消息,进行一些转换并将它们保存到数据库中。 dockerfile 很简单:

FROM adoptopenjdk:11-jre-hotspot
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENV JAVA_TOOL_OPTIONS=""
ENTRYPOINT ["java","-jar","/app.jar"]

我有一个

deploy.env
文件,其中包含应用程序使用的用户名、密码、服务器主机名等。一切都很好。

我只是用这个命令运行图像:

sudo docker run --env-file deploy.env -d -e --name myapp --rm myregistry.azurecr.io/myapp:latest

现在我想将其放入

docker-compose.yml
中,通过
docker compose
与其他一些服务一起运行。它使用完全相同的
deploy.env
文件。现在我把它放在自己的
docker-compose.yml
中,以确保与其他应用程序不存在任何类型的冲突。

version: "3.8"

services:
  myapp:
    image: myregistry.azurecr.io/myapp:latest
    container_name: myapp
    env_file:
      - deploy.env

但是,当我通过

docker compose
运行它时,它无法连接到 Azure EventHubs。 我收到此异常(IP 地址和 URL 因显而易见的原因而更改):

2023-12-20 20:48:47.805  INFO 1 --- org.apache.kafka.clients.NetworkClient   : [Consumer clientId=consumer-data-processor-1, groupId=data-processor] Node -1 disconnected.
2023-12-20 20:48:47.805  WARN 1 --- org.apache.kafka.clients.NetworkClient   : [Consumer clientId=consumer-data-processor-1, groupId=data-processor] Connection to node -1 (redacted.servicebus.windows.net/52.1.2.3:9093) terminated during authentication. This may happen due to any of the following reasons: (1) Authentication failed due to invalid credentials with brokers older than 1.0.0, (2) Firewall blocking Kafka TLS traffic (eg it may only allow HTTPS traffic), (3) Transient network issue.
2023-12-20 20:48:47.805  WARN 1 --- org.apache.kafka.clients.NetworkClient   : [Consumer clientId=consumer-data-processor-1, groupId=data-processor] Bootstrap broker redacted.servicebus.windows.net:9093 (id: -1 rack: null) disconnected
2023-12-20 20:48:47.976  WARN 1 --- o.apache.kafka.common.network.Selector   : [Consumer clientId=consumer-data-processor-3, groupId=data-processor] Unexpected error from redacted.servicebus.windows.net/52.1.2.3; closing connection 
java.lang.RuntimeException: non-nullable field authBytes was serialized as null
    at org.apache.kafka.common.message.SaslAuthenticateResponseData.read(SaslAuthenticateResponseData.java:137) ~[kafka-clients-3.1.2.jar!/:na]
    at org.apache.kafka.common.message.SaslAuthenticateResponseData.<init>(SaslAuthenticateResponseData.java:86) ~[kafka-clients-3.1.2.jar!/:na]
    at org.apache.kafka.common.requests.SaslAuthenticateResponse.parse(SaslAuthenticateResponse.java:76) ~[kafka-clients-3.1.2.jar!/:na]
    at org.apache.kafka.common.requests.AbstractResponse.parseResponse(AbstractResponse.java:187) ~[kafka-clients-3.1.2.jar!/:na]
    at org.apache.kafka.common.requests.AbstractResponse.parseResponse(AbstractResponse.java:109) ~[kafka-clients-3.1.2.jar!/:na]
    at org.apache.kafka.clients.NetworkClient.parseResponse(NetworkClient.java:729) ~[kafka-clients-3.1.2.jar!/:na]
    at org.apache.kafka.common.security.authenticator.SaslClientAuthenticator.receiveKafkaResponse(SaslClientAuthenticator.java:576) ~[kafka-clients-3.1.2.jar!/:na]
    at org.apache.kafka.common.security.authenticator.SaslClientAuthenticator.receiveToken(SaslClientAuthenticator.java:508) ~[kafka-clients-3.1.2.jar!/:na]
    at org.apache.kafka.common.security.authenticator.SaslClientAuthenticator.authenticate(SaslClientAuthenticator.java:302) ~[kafka-clients-3.1.2.jar!/:na]
    at org.apache.kafka.common.network.KafkaChannel.prepare(KafkaChannel.java:181) ~[kafka-clients-3.1.2.jar!/:na]
    at org.apache.kafka.common.network.Selector.pollSelectionKeys(Selector.java:543) ~[kafka-clients-3.1.2.jar!/:na]

似乎不知何故,我进入的网络设置有些不同

docker compose

错误是说

发生这种情况的原因可能是以下任一原因:(1) 由于 1.0.0 之前的代理的凭证无效而导致身份验证失败,(2) 防火墙阻止 Kafka TLS 流量(例如,它可能只允许 HTTPS 流量),(3)暂时性网络问题。

鉴于相同的应用程序使用普通 docker 在同一主机上运行良好,它不是 (1) 和 (3),这似乎指向 (2)。

我需要在

docker compose
中做一些额外的配置来解决这个问题吗?

java docker apache-kafka docker-compose azure-eventhub
1个回答
0
投票

事实证明,问题出在 Azure Eventhubs 使用的特定用户名上,该用户名始终是

$ConnectionString

现在,

docker compose
(不是
docker
)将其解释为其自己的环境变量占位符。

解决方案是用另一个

$
来转义它,如下所示:
KAFKA_USERNAME=$$ConnectionString

不幸的是,这也意味着 env 文件将无法正常使用

docker
,因为用户名变为
$$ConnectionString

© www.soinside.com 2019 - 2024. All rights reserved.