testcontainers / testcontainers/testcontainers-python

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

Ouverte
#407 8 commentaires 2 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

👀 requires attention 📦 package: kafka 🔀 requires triage
Langage dominant
Python
Étoiles
2.3k
Forks
386
Merge moyen
4 h 40 min
PR mergées (30 j)
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.

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Exécuter l’extrait KafkaContainer fourni sous pytest sur Windows 10 avec Testcontainers 3.6.0, puis inspecter le point d’entrée DockerClient.port indiqué dans le traceback et le paramètre TC_HOST. C’est terminé lorsque le conteneur démarre avec son port mappé et que les assertions du producteur/consommateur Kafka réussissent sous pytest comme lors de l’exécution en tant que script.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
docker, kafka, python, vscode
Domaine
devops, networking, testing-qa
Type d'issue
Bug
Difficulté
4/5
Temps estimé
3-5 jours
Activité
À l'abandon
Clarté
À clarifier
Accessibilité débutants
28/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.