【问题标题】:How set up test containers for paraller runwith docker compose?如何设置测试容器以使用 docker compose 并行运行?
【发布时间】:2019-12-15 07:12:12
【问题描述】:

这里是 docker-compose 文件:

  app:
    image: myimage
    depends_on:
      - nsqd
      - localstack
    command: ["run.sh"]
    environment:
      - "DYNAMODB=http://localstack:4569"
    ports:
      - 8080:8080

  nsqd:
    image: nsqio/nsq
    command: /run
    ports:
      - "4150:4150"
      - "4151:4151"

  localstack:
    image: localstack/localstack:latest
    ports:
      - 4569:4569
    environment:
      SERVICES: dynamodb
      DATA_DIR: /tmp/localstack/data
      HOSTNAME: localstack

这个 compose 文件在运行任何测试方法之前在 java junit test 中运行:

  @Before
  public void setUp() throws Exception {
        new DockerComposeContainer(new File("docker-compose.yaml"))
                .withExposedService("nsqd", 4150, Wait.forListeningPort())
                .withExposedService("localstack", 4569, Wait.forListeningPort())
                .withExposedService("app", 8080, Wait.forListeningPort())
                .start();
  }

当所有测试方法一一运行时,根本没有问题。但是当我尝试同时运行超过 2 个测试时,我 遇到这样的错误:

ERROR: for localstack  Cannot start service localstack: driver failed programming external connectivity on endpoint hwfdrbmwpwn1_localstack_1 (e33d2a3098e74b1b8d87e3e595d9d9504ccddd4fe9c0605b20ebd3f22f50daa5): Bind for 0.0.0.0:4569 failed: port is already allocated
ERROR: for nsqlookupd  Cannot start service nsqlookupd: driver failed programming external connectivity on endpoint hwfdrbmwpwn1_nsqlookupd_1 (fe62cec02a23a184d65b3f02776a14d77fdfbe639645ea0a11e07e8f11010e37): Bind for 0.0.0.0:4161 failed: port is already allocated

这些端口与withExposedService 功能不同。从另一端开始,撰写文件中的所有服务都在隔离网络中启动 所以不应该有任何冲突,但它们存在。任何 bpody 都可以解释端口发生了什么吗? 应该向测试容器提供哪些额外配置以同时多次运行 docker-compose 服务?

【问题讨论】:

    标签: docker docker-compose testcontainers


    【解决方案1】:

    withExposedService 定义的端口来自容器的内部视图。测试容器会将该端口绑定到一个随机的外部端口。在这里阅读:

    https://www.testcontainers.org/features/networking

    您是否也在每个测试方法之前停止 docker compose 容器?

    我还建议从您的 docker compose 文件中删除端口映射,因为 testcontainers 不需要这样做:

    请注意,不需要在 YAML 文件中定义要公开的端口;这将禁止在其他上下文中重用/包含文件。

    取自:https://www.testcontainers.org/modules/docker_compose/

    【讨论】:

    • Do you also stop your docker compose containers before each test method? - 这就是它的工作原理和我应该避免的。是的start -> test -> stop 有效。但是我想用许多随机端口启动多个docker-compose,并并行调用测试方法而不是一个一个,这是一个问题。
    • 嗯,我没发现问题。 Testcontainers 会将您的 docker compose 容器映射到主机系统上的随机端口上,因此多个 docker compose 容器的并行运行应该不成问题。
    • Mmh, I don't see the problem代码你试过了吗?
    【解决方案2】:

    如果我正确理解了您的设置,您希望为每个测试启动和停止 docker-compose 容器,并同时在不同测试(或使用相同文件的不同测试)中使用多个不同的 docker-compose-files 执行此操作.

    有一个替代库,Docker-Compose-Rule of Palantir!。

    实际上两者(testContainers 和 Palantir)之间正在进行协作,因为 testContainers 更加通用,但 Palantir 库使用 docker-compose 更深入。 协作始于 2018 年,但目前该库仍在维护中,因此它可能仍具有解决您问题的专业化优势。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-15
      • 1970-01-01
      • 2021-10-26
      • 2021-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-25
      相关资源
      最近更新 更多