testcontainers / testcontainers/testcontainers-python

Testcontainers work as expected, fail to map Docker port when run with pytest in VS Code

Open
#407 8 comments 2 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

👀 requires attention 📦 package: kafka 🔀 requires triage
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

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.