Search code examples
javaspring-boottestcontainersdocker-javatestcontainers-junit5

Testcontainer cannot configure port binding


I'm using testcontainer version 1.15.2. Tests are run in intellij on windows 10. I have a wiremock container. By default it listens on the port 8080. I would like to map this port to let's say 8081. So I do:

public WiremockContainer() {
    super("wiremock/wiremock:2.9.0-alpine");

    self()
            .waitingFor(Wait.forLogMessage(".*port:\\s*8080.*", 1)
                    .withStartupTimeout(Duration.ofSeconds(25L)))
            .withCreateContainerCmdModifier(cmd -> cmd.getHostConfig()
                    .withPortBindings(new PortBinding(Ports.Binding.bindPort(8081), new ExposedPort(8080)))
            )
            .withNetworkAliases("wiremock")
            .withExposedPorts(8081);
}

When the container is created it listens on the random port, not the 8081[1]. What am I doing wrong ? What should I do to make the container listen on 8081 instead of the random port ?

[1]

  1. I have another container that tries to connect on http://wiremock:8081 and keep getting Connection refused
  2. When I add: .waitingFor((...)forPort(8081)(...))); timeout occurs.

Solution

  • You cannot choose which actual port is used on the host machine. TestContainers chooses one automatically and makes it accessible through getMappedPort(containerPort) method on the container instance. You can also use getFirstMappedPort() if you only have one.

    Integer hostPort = container.getMappedPort(8080);
    Integer hostPort = container.getFirstMappedPort();
    

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