如何将Kafka CDC的docker run命令转为docker-compose并解决consumer报错
问题原因
你遇到的报错主要有两个核心原因:
- debezium/kafka镜像的初始化逻辑要求必须显式传入
ZOOKEEPER_CONNECT环境变量,仅配置links不会被容器自动识别。 - 你写的
command里包含管道符,这是Shell语法,默认docker-compose执行command不会启用Shell解析,必须把整条命令用sh -c包裹。
解决方法
1. 单次验证功能的consumer配置
替换你当前docker-compose里的consumer段即可:
consumer: image: debezium/kafka:1.1 links: - zookeeper - kafka environment: - ZOOKEEPER_CONNECT=zookeeper:2181 tty: true # 对应原docker run的-t参数 stdin_open: true # 对应原docker run的-i参数 restart: "no" # 消费完成退出后不自动重启,匹配一次性运行逻辑 command: sh -c "watch-topic -a bankserver1.bank.holding --max-messages 1 | grep '^{' | jq"
运行时建议等其他服务全部就绪后,单独启动consumer,完全匹配原docker run --rm的效果:
docker-compose run --rm consumer
2. 对接自定义Python脚本的最终版本配置
需要额外挂载本地脚本目录和输出目录:
consumer: image: debezium/kafka:1.1 links: - zookeeper - kafka environment: - ZOOKEEPER_CONNECT=zookeeper:2181 volumes: # 替换为你本地存放stream.py的目录路径 - ./local_script_dir:/opt/scripts # 替换为你本地要存放输出文件的目录路径 - ./local_output_dir:/opt/output tty: true stdin_open: true restart: "no" command: sh -c "watch-topic -a bankserver1.bank.holding | grep --line-buffered '^{' | python3 /opt/scripts/stream.py > /opt/output/holding_pivot.txt"
额外注意
你当前配置里postgres镜像版本是9.6,和原官方命令的12版本不一致,如果遇到Debezium连接Postgres的兼容问题,可以把postgres镜像改回debezium/postgres:12。
内容的提问来源于stack exchange,提问作者Chau Loi
相关产品推荐
相关产品推荐

