与docker容器交谈时更新本地/ etc / hosts

时间:2017-10-26 15:32:29

标签: java maven docker jenkins

我的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名称做广告。

我该如何解决这个问题:

  1. 也在Docker容器中运行Maven测试,但这需要Maven项目运行另一个Maven项目。
  2. 在运行时以编程方式更新JVM的DNS缓存。
  3. 两者对我来说似乎都是一个肮脏的解决方案。

1 个答案:

答案 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应该将自己宣传为同名。