Skip to content

Commit b67b590

Browse files
Mark Andreevtillahoffmann
authored andcommitted
Add ResourceCleaner for stop containers after exit (#104)
1 parent c5b7b1c commit b67b590

File tree

2 files changed

+49
-9
lines changed

2 files changed

+49
-9
lines changed

testcontainers/core/cleaner.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import atexit
2+
3+
from docker.errors import NotFound
4+
5+
from testcontainers.core.utils import setup_logger
6+
7+
logger = setup_logger(__name__)
8+
9+
10+
class ResourceCleaner:
11+
__INSTANCE = None
12+
13+
def __init__(self):
14+
self.containers = []
15+
16+
def attach(self, container):
17+
self.containers.append(container)
18+
19+
return container
20+
21+
def clean(self):
22+
for c in self.containers:
23+
try:
24+
c.stop()
25+
except NotFound:
26+
pass
27+
except Exception as e:
28+
logger.exception(e)
29+
30+
@classmethod
31+
def instance(cls):
32+
if cls.__INSTANCE is None:
33+
cls.__INSTANCE = ResourceCleaner()
34+
atexit.register(cls.__INSTANCE.clean)
35+
36+
return cls.__INSTANCE

testcontainers/core/docker_client.py

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
import urllib
1515
import docker
1616
from docker.models.containers import Container
17+
18+
from testcontainers.core.cleaner import ResourceCleaner
1719
from testcontainers.core.utils import inside_container
1820
from testcontainers.core.utils import default_gateway_ip
1921

@@ -30,15 +32,17 @@ def run(self, image: str,
3032
stdout: bool = True,
3133
stderr: bool = False,
3234
remove: bool = False, **kwargs) -> Container:
33-
return self.client.containers.run(image,
34-
command=command,
35-
stdout=stdout,
36-
stderr=stderr,
37-
remove=remove,
38-
detach=detach,
39-
environment=environment,
40-
ports=ports,
41-
**kwargs)
35+
return ResourceCleaner.instance().attach(
36+
self.client.containers.run(image,
37+
command=command,
38+
stdout=stdout,
39+
stderr=stderr,
40+
remove=remove,
41+
detach=detach,
42+
environment=environment,
43+
ports=ports,
44+
**kwargs)
45+
)
4246

4347
def port(self, container_id, port):
4448
port_mappings = self.client.api.port(container_id, port)

0 commit comments

Comments
 (0)