testcontainers / testcontainers/testcontainers-python
Bug: Starting multiple containers at once in parallel causes Conflict by starting ryuk container multiple times due to race condition
还没有人认领这个 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
贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
调研方向
从 Reaper._create_instance 开始,使用两个 PostgresContainer 实例运行 issue 中的 concurrent.futures 重现。完成的标准是,并发启动不再因尝试多次创建 ryuk 容器而产生 Conflict,同时两个容器都能成功启动。
由索引模型根据 Issue 内容生成。
评估
- 技术栈
- docker, python
- 领域
- testing-qa
- Issue 类型
- 缺陷
- 难度
- 4/5
- 预计耗时
- 3-5 天
- 活跃度
- 停滞
- 描述清晰度
- 基本清楚
- 新手友好度
- 35/100