From e54e582a6fd1879cb1025df4759d4346a1dd9734 Mon Sep 17 00:00:00 2001 From: Pepijn Date: Sun, 22 Mar 2026 21:12:26 -0700 Subject: [PATCH] fix(docker): bypass uv extras chain bug in libero_plus Dockerfile uv silently skips packages when resolving a nested extras chain (lerobot[libero_plus] -> lerobot[libero] -> hf-libero -> robosuite). POST-INSTALL grep confirmed robosuite absent after install despite uv reporting 'Resolved 113 packages, Installed 1'. Fix: install all libero_plus deps directly by name, bypassing the extras chain entirely. Also add --plain flag to build script for verbose output. Co-Authored-By: Claude Sonnet 4.6 --- docker/Dockerfile.eval-libero-plus | 25 +++++++++++++++++-------- docker/build_benchmark_images.sh | 4 ++++ 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/docker/Dockerfile.eval-libero-plus b/docker/Dockerfile.eval-libero-plus index 3ff8ff842..c6d6953af 100644 --- a/docker/Dockerfile.eval-libero-plus +++ b/docker/Dockerfile.eval-libero-plus @@ -14,15 +14,24 @@ FROM lerobot-eval-base:latest -# Diagnostic: show what's in the venv before the libero_plus install -RUN echo "=== PRE-INSTALL ===" && uv pip list | grep -iE "robosuite|bddl|robomimic|hf.libero|scikit.image|wand" || echo "(none of the libero_plus-specific packages are installed)" +# Install libero_plus deps explicitly rather than via ".[libero_plus]" extras chain. +# uv has a bug where it considers packages "already resolved" when coming through +# a nested lerobot[libero] → lerobot[libero_plus] extras chain, silently skipping them. +RUN uv pip install --no-cache \ + "hf-libero>=0.1.3,<0.2.0" \ + "hf-egl-probe>=1.0.1" \ + "transformers>=5.3.0,<6.0.0" \ + "scipy>=1.14.0,<2.0.0" \ + "bddl>=1.0.1,<2.0.0" \ + "future" \ + "easydict>=1.9" \ + "wand" \ + "scikit-image>=0.20.0" \ + "gym>=0.25.0,<0.27.0" -RUN uv pip install --no-cache ".[libero_plus]" \ - && echo "=== POST-INSTALL ===" && uv pip list | grep -iE "robosuite|bddl|robomimic" \ - # Clone LIBERO-plus; its setup.py has empty install_requires so deps come from the - # lerobot[libero] extra above. Install the package to get LIBERO-plus environments, - # then add a .pth so the libero module can locate its data files at runtime. - && git clone --depth 1 https://github.com/sylvestf/LIBERO-plus.git /tmp/LIBERO-plus \ +# Clone LIBERO-plus; install with --no-deps (runtime deps declared above via hf-libero). +# Add .pth so the libero module can locate its data files at runtime. +RUN git clone --depth 1 https://github.com/sylvestf/LIBERO-plus.git /tmp/LIBERO-plus \ && uv pip install --no-cache --no-deps /tmp/LIBERO-plus \ && python -c "import pathlib, site; pathlib.Path(site.getsitepackages()[0], 'libero_plus_repo.pth').write_text('/tmp/LIBERO-plus\n')" \ && python -c "import libero, robosuite, bddl" diff --git a/docker/build_benchmark_images.sh b/docker/build_benchmark_images.sh index c96fd6d77..eea4be9d7 100755 --- a/docker/build_benchmark_images.sh +++ b/docker/build_benchmark_images.sh @@ -27,6 +27,7 @@ PUSH=false HUB_ORG="" BENCHMARKS="libero libero_plus robomme robocasa" NO_CACHE_BASE=false +PROGRESS="auto" for arg in "$@"; do case "$arg" in @@ -34,6 +35,7 @@ for arg in "$@"; do --hub_org=*) HUB_ORG="${arg#*=}" ;; --benchmarks=*) BENCHMARKS="${arg#*=}" ;; --no-cache-base) NO_CACHE_BASE=true ;; + --plain) PROGRESS="plain" ;; *) echo "Unknown arg: $arg"; exit 1 ;; esac done @@ -57,6 +59,7 @@ fi echo "=== Building lerobot-eval-base ===" docker build \ ${BASE_CACHE_FLAG} \ + --progress="${PROGRESS}" \ -f "${SCRIPT_DIR}/Dockerfile.eval-base" \ -t lerobot-eval-base:latest \ "${REPO_ROOT}" || fail "lerobot-eval-base build failed" @@ -80,6 +83,7 @@ for BENCHMARK in $BENCHMARKS; do echo "" echo "=== Building ${LOCAL_TAG} from $(basename ${DOCKERFILE}) ===" docker build \ + --progress="${PROGRESS}" \ -f "${DOCKERFILE}" \ -t "${LOCAL_TAG}" \ "${REPO_ROOT}" || fail "${LOCAL_TAG} build failed"