如何为与docker compose并行运行设置测试容器?

时间:2019-08-07 15:37:17

标签: docker docker-compose testcontainers

这是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

在运行任何测试方法之前,此组合文件都在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();
  }

所有测试方法一一运行时,根本没有问题。但是当我尝试同时运行两个以上的测试时, 有这样的错误:

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可以解释端口的状况吗? 应该提供给testcontainers多次运行docker-compose服务的额外配置是什么?

2 个答案:

答案 0 :(得分:0)

withExposedService定义的端口是从容器的内部视图开始的。测试容器会将该端口绑定到随机的外部端口。在这里阅读:

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

在每种测试方法之前,您还停止docker compose容器吗?

我还建议您从docker compose文件中删除端口映射,因为对于testcontainers而言并不必要:

  

请注意,没有必要在YAML文件中定义要公开的端口。这会阻止在其他情况下文件的重用/包含。

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

答案 1 :(得分:0)

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

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

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