From 33fae082824272a229a083c5e4043476749cb698 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Ram=C3=ADrez=20Mondrag=C3=B3n?= Date: Thu, 21 May 2026 17:10:58 -0600 Subject: [PATCH] fix(core): close Reaper socket at interpreter exit to prevent ResourceWarning MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Ryuk keep-alive socket stored in `Reaper._socket` was never explicitly closed, so CPython's GC finalized it during interpreter shutdown and emitted a ResourceWarning ("unclosed ") that is impossible to suppress via warnings filters because it fires after pytest exits. Registering `Reaper.delete_instance` with `atexit` ensures the socket is closed cleanly before the GC sweep, eliminating the warning without changing the socket's lifetime during the test session. Signed-off-by: Edgar Ramírez Mondragón --- core/testcontainers/core/container.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/testcontainers/core/container.py b/core/testcontainers/core/container.py index 3fcdc980..7c1a64d7 100644 --- a/core/testcontainers/core/container.py +++ b/core/testcontainers/core/container.py @@ -1,3 +1,4 @@ +import atexit import contextlib import io import pathlib @@ -476,5 +477,6 @@ def _create_instance(cls) -> "Reaper": rs.send(f"label={LABEL_SESSION_ID}={SESSION_ID}\r\n".encode()) Reaper._instance = Reaper() + atexit.register(Reaper.delete_instance) return Reaper._instance