From 276481371e613d56c111c4fdc1067c87bdf24079 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A9=E9=AD=94?= Date: Tue, 4 Aug 2026 22:45:10 +0800 Subject: [PATCH] fix(docker): set DEER_FLOW_ROOT for log commands (#4658) * fix(docker): set DEER_FLOW_ROOT for log commands * fix(docker): set root before restart * docs(docker): clarify log command --- AGENTS.md | 3 +++ README.md | 1 + .../tests/test_docker_sandbox_mode_detection.py | 16 ++++++++++++++++ scripts/docker.sh | 11 +++++++++++ 4 files changed, 31 insertions(+) diff --git a/AGENTS.md b/AGENTS.md index d9b3b9260..3c08d01cd 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -112,6 +112,9 @@ make up / down # Build/stop the production Docker stack (browser at localhost: make docker-start / docker-stop / docker-logs # Docker development environment ``` +Docker log and restart commands resolve `DEER_FLOW_ROOT` from the current +checkout before invoking Compose, matching the start and stop commands. + Run `make help` for the full list. **Per-module commands drive a single module** (run inside that module): diff --git a/README.md b/README.md index 927389a9e..ca9668339 100644 --- a/README.md +++ b/README.md @@ -247,6 +247,7 @@ Use the table below as a practical starting point when choosing how to run DeerF ```bash make docker-init # Pull sandbox image (only once or when image updates) make docker-start # Start services (auto-detects sandbox mode from config.yaml) +make docker-logs # View logs ``` `make docker-start` starts `provisioner` only when `config.yaml` uses provisioner mode (`sandbox.use: deerflow.community.aio_sandbox:AioSandboxProvider` with `provisioner_url`). diff --git a/backend/tests/test_docker_sandbox_mode_detection.py b/backend/tests/test_docker_sandbox_mode_detection.py index 7191e4d7f..c95f7430f 100644 --- a/backend/tests/test_docker_sandbox_mode_detection.py +++ b/backend/tests/test_docker_sandbox_mode_detection.py @@ -104,3 +104,19 @@ sandbox: """.strip() assert _detect_mode_with_config(config) == "local" + + +@pytest.mark.parametrize("docker_command", ["logs --gateway", "restart"]) +def test_compose_commands_set_deer_flow_root_before_compose(docker_command): + """Log and restart commands should resolve mounts from the repository root.""" + with tempfile.TemporaryDirectory() as tmpdir: + command = f""" +source '{SCRIPT_PATH}' +PROJECT_ROOT='{tmpdir}' +DOCKER_DIR='{tmpdir}' +COMPOSE_CMD=capture_compose +capture_compose() {{ test "${{DEER_FLOW_ROOT:-}}" = "$PROJECT_ROOT"; }} +unset DEER_FLOW_ROOT +{docker_command} +""" + subprocess.check_call([BASH_EXECUTABLE, "-lc", command]) diff --git a/scripts/docker.sh b/scripts/docker.sh index 0e47e14c7..a53052ecc 100755 --- a/scripts/docker.sh +++ b/scripts/docker.sh @@ -282,6 +282,12 @@ start() { # View Docker development logs logs() { local service="" + + # DEER_FLOW_ROOT is referenced in docker-compose-dev.yaml; set it before + # reading logs so Compose does not resolve mounted paths from an empty root. + if [ -z "$DEER_FLOW_ROOT" ]; then + export DEER_FLOW_ROOT="$PROJECT_ROOT" + fi case "$1" in --frontend) @@ -333,6 +339,11 @@ stop() { # Restart Docker development environment restart() { + # DEER_FLOW_ROOT is referenced in docker-compose-dev.yaml; set it before + # restarting services so Compose resolves mounted paths from this checkout. + if [ -z "$DEER_FLOW_ROOT" ]; then + export DEER_FLOW_ROOT="$PROJECT_ROOT" + fi echo "========================================" echo " Restarting DeerFlow Docker Services" echo "========================================"