我有一个 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
中做一些额外的配置来解决这个问题吗?
事实证明,问题出在 Azure Eventhubs 使用的特定用户名上,该用户名始终是
$ConnectionString
。
现在,
docker compose
(不是docker
)将其解释为其自己的环境变量占位符。
解决方案是用另一个
$
来转义它,如下所示:
KAFKA_USERNAME=$$ConnectionString
不幸的是,这也意味着 env 文件将无法正常使用
docker
,因为用户名变为 $$ConnectionString
。