From 100707568541865f8fc6d26d6264f056293b5d4c Mon Sep 17 00:00:00 2001 From: TFM-HITESH Date: Thu, 13 Nov 2025 20:10:22 +0000 Subject: [PATCH] [fix]: Improved logical flow of docker environment searching for laddr --- lib/laddr/src/laddr/cli/utils/docker.py | 83 +++++++++++++++++++++---- lib/laddr/src/laddr/cli/utils/errors.py | 6 +- 2 files changed, 75 insertions(+), 14 deletions(-) diff --git a/lib/laddr/src/laddr/cli/utils/docker.py b/lib/laddr/src/laddr/cli/utils/docker.py index 3bde1c9..57e8155 100644 --- a/lib/laddr/src/laddr/cli/utils/docker.py +++ b/lib/laddr/src/laddr/cli/utils/docker.py @@ -9,6 +9,8 @@ from pathlib import Path import subprocess import time +import platform +import os import yaml @@ -16,15 +18,13 @@ from .logger import print_info, print_success -def check_docker() -> bool: - """Check if Docker is installed and running. +def is_wsl(): + """Check if the environment is WSL.""" + return "microsoft" in platform.uname().release.lower() - Returns: - True if Docker is available - Raises: - DockerNotFoundError: If Docker is not found or not running - """ +def _check_docker_daemon(): + """Check if the Docker daemon is running.""" try: result = subprocess.run( ["docker", "version"], @@ -32,12 +32,73 @@ def check_docker() -> bool: text=True, check=False, timeout=5, + env={"DOCKER_HOST": "unix:///var/run/docker.sock"}, ) - if result.returncode != 0: - raise DockerNotFoundError() - return True + return result.returncode == 0 except (FileNotFoundError, subprocess.TimeoutExpired): - raise DockerNotFoundError() + return False + + +def _check_docker_desktop(): + """Check if Docker Desktop is running.""" + try: + result = subprocess.run( + ["docker", "version"], + capture_output=True, + text=True, + check=False, + timeout=5, + ) + return result.returncode == 0 + except (FileNotFoundError, subprocess.TimeoutExpired): + return False + + +def check_docker() -> bool: + """Check if Docker is installed and running. + + Returns: + True if Docker is available + + Raises: + DockerNotFoundError: If Docker is not found or not running + """ + system = platform.system() + + if system == "Linux": + if is_wsl(): + # Windows + WSL + if _check_docker_daemon(): + return True + print_info("Docker daemon not found in WSL. Trying Docker Desktop...") + if _check_docker_desktop(): + return True + raise DockerNotFoundError( + "Docker not found in WSL. Laddr could not connect to the Docker daemon within WSL or to Docker Desktop. Please ensure one of them is installed, running, and configured for WSL." + ) + else: + # Linux + if _check_docker_daemon(): + return True + print_info("Docker daemon not found. Trying Docker Desktop...") + if _check_docker_desktop(): + return True + raise DockerNotFoundError( + "Docker not found. Laddr could not connect to the Docker daemon or Docker Desktop. Please ensure one of them is installed and running." + ) + elif system == "Windows": + if _check_docker_desktop(): + return True + raise DockerNotFoundError( + "Docker Desktop not found. Please ensure that Docker Desktop is installed and running." + ) + else: + # Other systems + if _check_docker_desktop(): + return True + raise DockerNotFoundError( + "Docker not found. Please ensure that Docker is installed and running." + ) def check_docker_compose() -> bool: diff --git a/lib/laddr/src/laddr/cli/utils/errors.py b/lib/laddr/src/laddr/cli/utils/errors.py index 546b90d..6d2787d 100644 --- a/lib/laddr/src/laddr/cli/utils/errors.py +++ b/lib/laddr/src/laddr/cli/utils/errors.py @@ -59,10 +59,10 @@ def __init__(self, filename: str, details: str): class DockerNotFoundError(LaddrError): """Raised when Docker is not installed or not running.""" - def __init__(self): + def __init__(self, message: str = "Docker not found or not running"): super().__init__( - "Docker not found or not running", - hint="Install Docker (https://docs.docker.com/get-docker/) and ensure it's running", + message, + hint="Please ensure that Docker is installed and running.", )