Skip to content

Commit b51eecc

Browse files
committed
fix(core): Determine docker socket for rootless docker
fixes #537
1 parent 46913c1 commit b51eecc

File tree

1 file changed

+19
-1
lines changed

1 file changed

+19
-1
lines changed

core/testcontainers/core/config.py

+19-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
from pathlib import Path
77
from typing import Optional, Union
88

9+
import docker
10+
911

1012
class ConnectionMode(Enum):
1113
bridge_ip = "bridge_ip"
@@ -24,14 +26,30 @@ def use_mapped_port(self) -> bool:
2426
return True
2527

2628

29+
def get_docker_socket() -> str:
30+
"""
31+
Determine the docker socket, prefer value given by env variable
32+
33+
Using the docker api ensure we handle rootless docker properly
34+
"""
35+
if socket_path := environ.get("TESTCONTAINERS_DOCKER_SOCKET_OVERRIDE"):
36+
return socket_path
37+
38+
client = docker.from_env()
39+
try:
40+
return client.api.get_adapter(client.api.base_url).socket_path
41+
except AttributeError:
42+
return "/var/run/docker.sock"
43+
44+
2745
MAX_TRIES = int(environ.get("TC_MAX_TRIES", 120))
2846
SLEEP_TIME = int(environ.get("TC_POOLING_INTERVAL", 1))
2947
TIMEOUT = MAX_TRIES * SLEEP_TIME
3048

3149
RYUK_IMAGE: str = environ.get("RYUK_CONTAINER_IMAGE", "testcontainers/ryuk:0.8.1")
3250
RYUK_PRIVILEGED: bool = environ.get("TESTCONTAINERS_RYUK_PRIVILEGED", "false") == "true"
3351
RYUK_DISABLED: bool = environ.get("TESTCONTAINERS_RYUK_DISABLED", "false") == "true"
34-
RYUK_DOCKER_SOCKET: str = environ.get("TESTCONTAINERS_DOCKER_SOCKET_OVERRIDE", "/var/run/docker.sock")
52+
RYUK_DOCKER_SOCKET: str = get_docker_socket()
3553
RYUK_RECONNECTION_TIMEOUT: str = environ.get("RYUK_RECONNECTION_TIMEOUT", "10s")
3654
TC_HOST_OVERRIDE: Optional[str] = environ.get("TC_HOST", environ.get("TESTCONTAINERS_HOST_OVERRIDE"))
3755

0 commit comments

Comments
 (0)