diff --git a/src/devx/molecule/start_docker.py b/src/devx/molecule/start_docker.py index 9345ff3..435dc9b 100644 --- a/src/devx/molecule/start_docker.py +++ b/src/devx/molecule/start_docker.py @@ -182,6 +182,12 @@ def start_docker_daemon(timeout: int = DEFAULT_TIMEOUT) -> bool: click.echo(f"Docker daemon already running (free space: {free_gb:.1f} GB)") if free_bytes >= MIN_FREE_BYTES: return True + # If free_bytes is 0, the Docker root dir is on the host filesystem + # (not accessible from inside the container). The host Docker has + # access to the full 455G disk — always use it in that case. + if free_bytes == 0: + click.echo("Host Docker root dir not accessible from container, using host Docker") + return True click.echo( f"Host Docker has only {free_gb:.1f} GB free " f"(need ≥ {MIN_FREE_BYTES / 1024**3:.0f} GB), trying rootless sockets..." diff --git a/tests/unit/test_start_docker.py b/tests/unit/test_start_docker.py index e2f4a18..0296385 100644 --- a/tests/unit/test_start_docker.py +++ b/tests/unit/test_start_docker.py @@ -136,6 +136,16 @@ class TestStartDockerDaemon: mock_ready.assert_called_once() mock_diag.assert_called_once() + @patch("devx.molecule.start_docker._diagnose_socket") + @patch("devx.molecule.start_docker._get_docker_free_bytes", return_value=0) + @patch("devx.molecule.start_docker.is_docker_ready", return_value=True) + def test_host_socket_inaccessible_root_uses_host( + self, mock_ready: MagicMock, mock_free: MagicMock, mock_diag: MagicMock + ) -> None: + """Should use host Docker when root dir is inaccessible (free=0).""" + assert start_docker_daemon(timeout=5) is True + mock_ready.assert_called_once() + @patch("devx.molecule.start_docker._diagnose_socket") @patch("devx.molecule.start_docker._get_docker_free_bytes", return_value=5 * 1024**3) @patch("devx.molecule.start_docker.is_docker_ready", return_value=True)