testcontainers / testcontainers/testcontainers-python

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

未关闭
#746 5 条评论 4 个 reaction 已指派 0 人 在 GitHub 查看

还没有人认领这个 Issue。

主要语言
Python
星标
2.3k
派生
386
平均合并
4 小时 40 分钟
30 天内合并 PR
1

描述

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

贡献指南

打开贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

调研方向

从 Reaper._create_instance 开始,使用两个 PostgresContainer 实例运行 issue 中的 concurrent.futures 重现。完成的标准是,并发启动不再因尝试多次创建 ryuk 容器而产生 Conflict,同时两个容器都能成功启动。

由索引模型根据 Issue 内容生成。

评估

技术栈
docker, python
领域
testing-qa
Issue 类型
缺陷
难度
4/5
预计耗时
3-5 天
活跃度
停滞
描述清晰度
基本清楚
新手友好度
35/100

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。