我的maven POM文件创建了带有测试服务的docker容器。它还运行必须与这些容器中的服务进行通信的测试。容器可以使用在docker-compose.yml
文件中定义为链接的主机名相互通信,例如:
kafka:
image: spotify/kafka
hostname: kafka
environment:
ADVERTISED_HOST: kafka
ADVERTISED_PORT: 9092
ports:
- "9092:9092"
our_service:
build: ../../logstash/
ports:
- "8081:8080"
links:
- kafka
这是因为,每个容器的/etc/hosts
文件包含指向群集中其他容器的链接的条目。但是,在集群外部,运行Maven测试的地方/etc/hosts
未更新,我不希望它更新,因为它将在Jenkins CI上运行。
当然,我的测试可以通过localhost:9092与Kafka交谈,但是Kafka要求生产者连接到kafka主机,而不是本地主机,如果它已经以kafka名称做广告。
我该如何解决这个问题:
两者对我来说似乎都是一个肮脏的解决方案。
答案 0 :(得分:0)
我会给出一个建议(但是,我不确定卡夫卡的内部是否允许这样做)。
您可以使用nip.io等DNS服务为127.0.0.1
创建名称kafka.127.0.0.1.nip.io
。您的服务将成为:
kafka:
image: spotify/kafka
hostname: kafka
environment:
ADVERTISED_HOST: kafka.127.0.0.1.nip.io
ADVERTISED_PORT: 9092
ports:
- "9092:9092"
our_service:
build: ../../logstash/
ports:
- "8081:8080"
links:
- kafka:kafka.127.0.0.1.nip.io
现在,您的Kafka制作人将连接到kafka.127.0.0.1.nip.io
的容器外部和内部,而Kafka应该将自己宣传为同名。