Docker Compose中Kafka生产者连接报错:bootstrap.servers URL无效
问题
在Docker Compose栈中部署Kafka生产者时遇到连接异常:本地运行生产者,通过指向Kafka容器映射端口的环境变量可成功发送消息;但生产者容器化后,尽管环境变量已正确传递,仍抛出错误:
ConfigException: Invalid url in bootstrap.servers: "kafka:29092"
基于Confluent和Spring相关示例搭建ZooKeeper与Kafka,相关配置如下:
docker-compose.yml
version: '3' networks: integrations: ipam: driver: default services: zookeeper: image: confluentinc/cp-zookeeper:latest hostname: zookeeper environment: ZOOKEEPER_CLIENT_PORT: 2181 ZOOKEEPER_TICK_TIME: 2000 ALLOW_ANONYMOUS_LOGIN: "yes" ZOO_ADMINSERVER_ENABLED: "true" healthcheck: test: [ "CMD", "nc", "-zv", "127.0.0.1", "2181" ] interval: 120s timeout: 10s retries: 5 ports: - 2181:2181 networks: integrations: kafka: image: confluentinc/cp-kafka:latest hostname: kafka depends_on: - zookeeper restart: on-failure ports: - 9092:9092 environment: KAFKA_BROKER_ID: 1 KAFKA_ADVERTISED_HOST_NAME: kafka KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:29092 ,PLAINTEXT_HOST://localhost:9092 KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1 healthcheck: test: [ "CMD", "nc", "-zv", "127.0.0.1", "9092" ] interval: 120s timeout: 10s retries: 5 networks: integrations: producer: hostname: producer build: context: https://github.com/bry-git/SampleKafkaProducer.git#main dockerfile: Dockerfile depends_on: - zookeeper - kafka ports: - 8081:8081 environment: - BOOTSTRAP_SERVER="kafka:29092" - KAFKA_TOPIC="primary" command: ["gradle", "bootRun"] networks: integrations:
Spring配置(application.yml)
server: port: 8088 spring: kafka: bootstrap-servers: ${BOOTSTRAP_SERVER} topic: name: ${KAFKA_TOPIC} producer: key-serializer: org.apache.kafka.common.serialization.StringSerializer value-serializer: org.apache.kafka.common.serialization.StringSerializer
Dockerfile
FROM gradle:jdk11 COPY . /SampleKafkaProducer WORKDIR /SampleKafkaProducer ARG BOOTSTRAP_SERVER ENV BOOTSTRAP_SERVER=${BOOTSTRAP_SERVER} ARG KAFKA_TOPIC ENV KAFKA_TOPIC=${KAFKA_TOPIC} EXPOSE 8088
排查记录
- 环境变量已成功传递:容器日志显示
bootstrap.servers = ["kafka:29092"] - 容器间网络连通正常:进入生产者容器后,通过
nc命令可成功连接kafka的9092、29092端口及zookeeper的2181端口 - 本地运行生产者可正常连接Kafka
- 已尝试交换监听器配置、分配固定IP,均未解决问题
解决方案
问题根源在于环境变量的引号传递:
在docker-compose.yml的producer环境变量配置中,BOOTSTRAP_SERVER="kafka:29092"的双引号会被直接传递到容器内部,导致Spring读取到的地址是带引号的"kafka:29092",而Kafka客户端无法解析带引号的URL,从而抛出无效地址错误。
修复步骤:
- 修改docker-compose.yml中producer的环境变量,去掉引号:
environment: - BOOTSTRAP_SERVER=kafka:29092 - KAFKA_TOPIC=primary - 重新构建并启动容器:
docker-compose down docker-compose up --build
额外优化建议:
- 移除Dockerfile中的ARG声明,因为docker-compose直接传递环境变量,无需通过构建参数中转,简化配置:
FROM gradle:jdk11 COPY . /SampleKafkaProducer WORKDIR /SampleKafkaProducer EXPOSE 8088 - 当前Kafka的
KAFKA_ADVERTISED_LISTENERS配置正确:PLAINTEXT对应容器内可访问的kafka:29092,PLAINTEXT_HOST对应外部可访问的localhost:9092,无需调整。
内容的提问来源于stack exchange,提问作者bcran
相关产品推荐
相关产品推荐

