testcontainers / testcontainers/testcontainers-python

Bug: Starting multiple containers at once in parallel causes Conflict by starting ryuk container multiple times due to race condition

Offen
#746 5 Kommentare 4 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Vorherrschende Sprache
Python
Sterne
2.3k
Forks
386
Ø Merge
4 Std. 40 Min.
Gemergte PRs (30 T.)
1

Beschreibung

Describe the bug

Starting two testcontainers at once triggers both of them to call Reaper._create_instance close in time. Both Reaper instances attempt to create the same ryuk container (since SESSION_ID is the same).

This is relevant when using pytest-parallel, which my organization does. I can probably work around the problem by serializing testcontainer start() calls on one thread.

To Reproduce

from testcontainers.postgres import PostgresContainer
import concurrent.futures


def start_postgres_container(port: int):
    with PostgresContainer(port=port) as postgres:
        print("Postgres is running on port", postgres.get_exposed_port(port))


with concurrent.futures.ThreadPoolExecutor() as executor:
    future1 = executor.submit(start_postgres_container, port=5400)

    # Uncommenting this reliably avoids the error
    # import time
    # time.sleep(5)
    future2 = executor.submit(start_postgres_container, port=5401)
    future1.result()
    future2.result()

Runtime environment

Provide a summary of your runtime environment. Which operating system, python version, and docker version are you using? What is the version of testcontainers-python you are using? You can run the following commands to get the relevant information.

# Get the operating system information (on a unix os).
$ uname -a
Darwin xxx 24.1.0 Darwin Kernel Version 24.1.0: Thu Oct 10 21:03:11 PDT 2024; root:xnu-11215.41.3~2/RELEASE_ARM64_T6020 arm64 arm Darwin
$ python --version
Python 3.11.10
$ docker info
# Get all python packages.
$ pip freeze
certifi==2024.8.30
charset-normalizer==3.4.0
docker==7.1.0
idna==3.10
requests==2.32.3
testcontainers==4.8.2
typing_extensions==4.12.2
urllib3==2.2.3
wrapt==1.17.0

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Beginne mit Reaper._create_instance und führe die concurrent.futures-Reproduktion aus dem Issue mit zwei PostgresContainer-Instanzen aus. Als erledigt gilt, dass parallele Starts nicht mehr zu einem Conflict führen, weil versucht wird, den ryuk-Container mehrfach zu erstellen, und dass beide Container erfolgreich starten.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
docker, python
Bereich
testing-qa
Issue-Typ
Bug
Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Aktivitätsstatus
Veraltet
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
35/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.