testcontainers / testcontainers/testcontainers-python
Testcontainers work as expected, fail to map Docker port when run with pytest in VS Code
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 2.3k
- Forks
- 386
- Avg merge
- 4h 40m
- Merged PRs (30d)
- 1
Description
Describe the bug
I copied this code from the python-kafka tests in this repo.
I am able to run it successfully as a script. However, when I run in pytest, the docker container doesn't even start because it can't map to a port.
This behavior only happens when I run pytest.
The error code is as follows:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <testcontainers.core.docker_client.DockerClient object at 0x0000016333B4DE90>
container_id = '0100dda1fb4811efbdf5743faf5208c2113f7952824e04799df9c3b497bd9864'
port = 9093
def port(self, container_id, port):
port_mappings = self.client.api.port(container_id, port)
if not port_mappings:
> raise RuntimeError(f'port mapping for container {container_id} and port {port} is not '
'available')
E RuntimeError: port mapping for container 0100dda1fb4811efbdf5743faf5208c2113f7952824e04799df9c3b497bd9864 and port 9093 is not available
I believe this is a windows issue as I had to add os.environ['TC_HOST'] = 'localhost' because Windows has issues connecting to the localnpipe named pipe.
To Reproduce
from kafka import KafkaConsumer, KafkaProducer, TopicPartition
from testcontainers.kafka import KafkaContainer
import os
def test_kafka_confluent_7_1_3():
kafka_container = KafkaContainer("confluentinc/cp-kafka:7.1.3")
# set the advertised listeners to be the container's IP address
with kafka_container as container:
container.get_bootstrap_server()
produce_and_consume_kafka_message(container)
def produce_and_consume_kafka_message(container):
topic = 'test-topic'
bootstrap_server = container.get_bootstrap_server()
producer = KafkaProducer(bootstrap_servers=[bootstrap_server])
producer.send(topic, b"verification message")
producer.flush()
producer.close()
consumer = KafkaConsumer(bootstrap_servers=[bootstrap_server])
tp = TopicPartition(topic, 0)
consumer.assign([tp])
consumer.seek_to_beginning()
assert consumer.end_offsets([tp])[tp] == 1, \
"Expected exactly one test message to be present on test topic !"
if __name__ == '__main__':
test_kafka_confluent_7_1_3()
Runtime environment
Windows 10
Testcontainers 3.6.0
kafka-python 2.0.2
I am running the snippet above in pipenv, so it is not Docker in Docker.
Will update if I find a solution.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Run the provided KafkaContainer snippet under pytest on Windows 10 with Testcontainers 3.6.0, then inspect the DockerClient.port entry point shown in the traceback and the TC_HOST setting. Done means the container starts with its port mapped and the Kafka producer/consumer assertions pass under pytest as they do when run as a script.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- docker, kafka, python, vscode
- Domain
- devops, networking, testing-qa
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Needs clarification
- Newbie friendliness
- 28/100