【问题标题】:Updating local /etc/hosts when talking to docker containers与 docker 容器对话时更新本地 /etc/hosts
【发布时间】:2018-04-08 01:45:01
【问题描述】:

我的 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 主机,而不是 localhost,如果它以 kafka 名称进行广告。

我该如何解决这个问题:

  1. 也可以在 docker 容器中运行 Maven 测试,但这需要 Maven 项目运行另一个 Maven 项目。
  2. 在运行时以编程方式更新 JVM 的 DNS 缓存。

对我来说,两者似乎都是一个肮脏的解决方案。

【问题讨论】:

  • 也许我误解了你的设置,但你在做什么样的测试?您是在尝试测试与 kafka 的通信还是尝试测试您的应用程序?如果是这样,为什么需要卡夫卡?你不能使用模拟等吗?
  • @khmarbaise 我有一个应用程序 A 从 Kafka 读取数据,对其进行转换并发送到另一个应用程序 B。在我的测试中,我模拟了应用程序 B 以验证它是否收到了正确的数据。跨度>

标签: java maven docker jenkins


【解决方案1】:

我会给出一个建议(不过,我不确定 Kafka 的内部是否允许这样做)。

您可以使用 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 应该以相同的名称宣传自己。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多