testcontainers / testcontainers/testcontainers-python

Bug: file descriptor leak in HttpWaitStrategy

Ouverte Adaptée aux débutants
#1,115 0 commentaires 1 réaction 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

Langage dominant
Python
Étoiles
2.3k
Forks
386
Merge moyen
4 h 40 min
PR mergées (30 j)
1

Description

Describe the bug

When using an HttpWaitStrategy in DockerContainer.waiting_for and the container image respond with an error code, the underlying HttpError is not correctly handled, leaking a file descriptor.

To Reproduce

Example with the https://hub.docker.com/r/typesense/typesense image, but should work with any image providing a HTTP server that takes a few seconds to start:

# mre.py
from testcontainers.core.container import DockerContainer
from testcontainers.core.wait_strategies import HttpWaitStrategy

print("starting")
with (
    DockerContainer("typesense/typesense:30.2", command="--data-dir /home --api-key=whatever --enable-cors")
    .with_exposed_ports(8108)
    .waiting_for(HttpWaitStrategy(8108, "/health").for_status_code(200))
):
    print("ok")
$ python -Werror::ResourceWarning mre.py
starting
Exception ignored while calling deallocator <function _TemporaryFileCloser.__del__ at 0x101984880>:
Traceback (most recent call last):
  File "/Users/loic/.local/share/uv/python/cpython-3.14.4-macos-aarch64-none/lib/python3.14/tempfile.py", line 484, in __del__
    _warnings.warn(self.warn_message, ResourceWarning)
ResourceWarning: Implicitly cleaning up <HTTPError 503: ''>
ok

Root Cause / fix

The issue is in https://github.com/testcontainers/testcontainers-python/blob/5c70d540e0df919e2de77ce8cc75b5c50cd772e7/src/testcontainers/core/wait_strategies.py#L428-L437

HttpError holds a reference to a (temporary) file storing the HTTP response, so it must be handled in a context manager to safely clean the file when the error is discarded.

Fixed MRE:

# mre.py
from contextlib import nullcontext
from typing import Union
from urllib.error import HTTPError, URLError

from testcontainers.core.container import DockerContainer
from testcontainers.core.wait_strategies import HttpWaitStrategy

class _FixedHttpWaitStrategy(HttpWaitStrategy):
    def _handle_http_error(self, error: Union[URLError, HTTPError]) -> bool:
        with error if isinstance(error, HTTPError) else nullcontext(error):
            return super()._handle_http_error(error)

print("starting")
with (
    DockerContainer("typesense/typesense:30.2", command="--data-dir /home --api-key=whatever --enable-cors")
    .with_exposed_ports(8108)
    .waiting_for(_FixedHttpWaitStrategy(8108, "/health").for_status_code(200))
):
    print("ok")

Runtime environment

  • MacOS 26.6.2
  • Python 3.14.4
  • testcontainers 4.14.2

I can work on a PR if you'd like!

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

Commencez dans src/testcontainers/core/wait_strategies.py, autour de HttpWaitStrategy._handle_http_error, que l’issue identifie comme l’emplacement de la fuite. Exécutez le MRE fourni avec -Werror::ResourceWarning sur l’image typesense/typesense pour la reproduire. Le travail est terminé lorsqu’une réponse d’erreur HTTP est correctement nettoyée et que le MRE se termine sans la ResourceWarning.

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

Évaluation

Stack technique
docker, python
Domaine
testing-qa
Type d'issue
Bug
Difficulté
2/5
Temps estimé
1-3 heures
Activité
Active
Clarté
Clairement spécifiée
Accessibilité débutants
88/100

Recevez les nouvelles issues par e-mail

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