-
-
Notifications
You must be signed in to change notification settings - Fork 512
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[Bug]: Explicitely mapped ports break default readiness hook #2652
Comments
Hey @robinvanderstraeten-klarrio thanks for opening this issue, yeah, I see it clear with your report where the bug is. I think your fix will work, so feel free to elaborate a PR when you have the time. Thanks for your contribution! |
I have one related question: why do you need a fixed port? Testcontainers will provide APIs to discover the random port for the service, gcs in this case. I'd like to understand more on your use case. |
@mdelapenya it's because we require the public port inside of the container for public-api address which is returned by the program to client so that the client can reach the container back. In this particular case, it is the fake gcs container: https://github.com/fsouza/fake-gcs-server. There's a public host setting https://github.com/fsouza/fake-gcs-server/blob/main/internal/config/config.go#L74, this address is returned to the client who wants to read a file, and that address becomes a full signed URL like http://localhost:port/storage/v1/b/... The port needs to be a port reachable from the host where the client runs. You'd normally see this behavior in other places, the most notorious would be Apache Kafka that also requires you to advertise a public hostname and an internal hostname (https://docs.confluent.io/platform/current/installation/configuration/broker-configs.html#advertised-listeners). Sometimes you simply need to know the public port before the container is started. Normally, when this happens, an approach similar to this is preffered: https://github.com/radekg/app-kit-orytest/blob/master/common/common.go#L42-L108. |
Wdyt about contributing a module for the fake-gcs-server? Then we can do this magic inside the module, hiding the implementation details to the users. Thoughts? |
@mdelapenya |
@absorbb have you tried toxyproxy for that? We have an example here https://golang.testcontainers.org/examples/toxiproxy/ Probably worth it to convert it into a real Go module 🤔 |
Hi @mdelapenya. I'm experiencing same issue using RabbitMQ testcontainer. Hope that you manage to use the fork proposed by @robinvanderstraeten-klarrio |
chipping in, as I have the same problem but a slightly different cause. We're having exposed ports defined as I'm not sure if the provided PR already covers for this. @robinvanderstraeten-klarrio could you add a test case to make sure? |
Thanks to all of you folks that were involved in the resolution of this bug 🙇 |
Hey @mdelapenya, is there a chance there will be a patch version released with this fix? |
Testcontainers version
0.32.0
Using the latest Testcontainers version?
Yes
Host OS
Linux (WSL)
Host arch
x86_64
Go version
1.22.3
Docker version
Client: Docker Engine - Community Version: 26.0.1 API version: 1.45 Go version: go1.21.9 Git commit: d260a54 Built: Thu Apr 11 10:53:21 2024 OS/Arch: linux/amd64 Context: default Server: Docker Engine - Community Engine: Version: 26.0.1 API version: 1.45 (minimum version 1.24) Go version: go1.21.9 Git commit: 60b9add Built: Thu Apr 11 10:53:21 2024 OS/Arch: linux/amd64 Experimental: false containerd: Version: 1.6.31 GitCommit: e377cd56a71523140ca6ae87e30244719194a521 runc: Version: 1.1.12 GitCommit: v1.1.12-0-g51d5e94 docker-init: Version: 0.19.0 GitCommit: de40ad0
Docker info
What happened?
Since version 0.32.0 of testcontainers, creating a container with an explicit port mapping in
ExposedPorts
(for instance"4443:4443/tcp"
) no longer works. The container starts correctly, but a newly introduced readiness check fails. It incorrectly parses the input given inExposedPorts
and concludes that the container did not start correctly. For context, I'm talking about the logic here.I'm aware that testcontainers creates a port mapping for you, but sometimes you need to know the port before the container starts. Here's an example snippet:
Relevant log output
failed to start container: all exposed ports, [4443:4443/tcp], were not mapped in 5s: port 4443:4443/tcp is not mapped yet
Additional information
I have made a fork with a suggestion for a fix. robinvanderstraeten-klarrio@193ab06
If this is the right approach I'll submit a PR.
The text was updated successfully, but these errors were encountered: