simready-validator / Dockerfile
loginowskid's picture
Sync from simready-oem-library-pm@c858e9dd
cd53438 verified
# SimReady Validator β€” HuggingFace Space image
#
# Base: nvcr.io/nvidia/isaac-sim:4.5.0. Ships Kit at /isaac-sim/ so
# runner._kit_available() auto-selects --use-kit and the validator
# runs PhysX / MDL rules without a code change.
#
# UID 1000 is required by HF Spaces. The Isaac Sim base already has
# a user at UID 1000 (varies between releases β€” ubuntu / kit / etc.),
# so we REUSE it rather than create one. /app is the workspace dir
# with HOME=/app so Claude Code CLI finds skills under ~/.claude/skills
# regardless of the existing user's name.
FROM nvcr.io/nvidia/isaac-sim:4.5.0
# Skip interactive prompts during apt-get (the deadsnakes PPA install
# pulls tzdata in as a dep, which otherwise blocks the build asking
# for a geographic area).
ENV DEBIAN_FRONTEND=noninteractive
ENV TZ=Etc/UTC
# System deps (Ubuntu 22.04). Isaac Sim base may ship apt/pip configs
# pointing at NVIDIA-internal mirrors (urm.nvidia.com) that HF Spaces'
# build infra can't reach β€” wipe those before any install. The base
# default Python is 3.10; simready-validate requires >=3.11, so we
# install python3.11 from the deadsnakes PPA and use it explicitly
# for everything below.
RUN apt-get update && apt-get install -y --no-install-recommends \
git curl ca-certificates rsync gnupg software-properties-common \
&& add-apt-repository -y ppa:deadsnakes/ppa \
&& apt-get update && apt-get install -y --no-install-recommends \
python3.11 python3.11-venv python3.11-distutils \
&& curl -fsSL https://bootstrap.pypa.io/get-pip.py | python3.11 \
&& curl -fsSL https://deb.nodesource.com/setup_20.x | bash - \
&& apt-get install -y --no-install-recommends nodejs \
&& rm -rf /var/lib/apt/lists/*
RUN npm config set registry https://registry.npmjs.org/ \
&& rm -f /root/.npmrc /etc/npmrc \
&& rm -f /root/.pip/pip.conf /etc/pip.conf
# Claude Code CLI.
RUN npm install -g --registry=https://registry.npmjs.org/ \
@anthropic-ai/claude-code@latest
# Workspace nesting matches the legacy layout (/home/appuser/app)
# because runner.py uses Path(__file__).resolve().parents[2] to find
# tools/spec_sync/state.json β€” needs at least 3 levels of parent.
# We don't create the appuser account (UID 1000 already exists in the
# base image with a different name); we just use the path. HOME points
# at the workspace's parent so Claude Code CLI finds ~/.claude/skills.
RUN mkdir -p /home/appuser/app /home/appuser/.claude/skills
WORKDIR /home/appuser/app
ENV HOME=/home/appuser
# Python deps (system Python, public PyPI). --break-system-packages
# because Ubuntu 22.04 marks system Python as PEP-668 externally-
# managed; on a build-once container image that's the right trade-off.
COPY tools/hf_space/requirements.txt ./requirements.txt
RUN python3.11 -m pip install --no-cache-dir --break-system-packages \
--index-url https://pypi.org/simple/ \
-r requirements.txt
# Foundation specs.
ENV SIMREADY_FOUNDATIONS_PATH=/opt/simready_foundations
ENV SIMREADY_FOUNDATIONS_COMMIT=805d2c50179a9878c89b0f41baaa0ecafe47c3d7
RUN git clone https://github.com/NVIDIA/simready-foundation \
${SIMREADY_FOUNDATIONS_PATH} \
&& cd ${SIMREADY_FOUNDATIONS_PATH} \
&& git checkout ${SIMREADY_FOUNDATIONS_COMMIT}
# Vendored simready-foundation-core wheel.
COPY tools/hf_space/wheels/simready_foundation_core-0.2.0a1-py3-none-any.whl /tmp/
RUN python3.11 -m pip install --no-cache-dir --break-system-packages \
--index-url https://pypi.org/simple/ \
/tmp/simready_foundation_core-0.2.0a1-py3-none-any.whl \
&& rm /tmp/simready_foundation_core-0.2.0a1-py3-none-any.whl
# Validator + Space code.
COPY tools/validation /home/appuser/app/tools/validation
COPY tools/hf_space/app.py ./app.py
COPY tools/hf_space/runner.py ./runner.py
COPY tools/hf_space/github_issues.py ./github_issues.py
COPY tools/hf_space/agentic_issues.py ./agentic_issues.py
COPY README.md ./README.md
COPY VALIDATE.md ./VALIDATE.md
# Claude Code skills (HOME=/home/appuser β†’ ~/.claude/skills).
COPY tools/hf_space/skills/simready-validator-agent /home/appuser/.claude/skills/simready-validator-agent
COPY tools/validation/plugins/simready-report/skills/simready-report /home/appuser/.claude/skills/simready-report
# UID 1000 owns the workspace + foundation clone.
RUN chown -R 1000:1000 /home/appuser ${SIMREADY_FOUNDATIONS_PATH}
# runner._kit_available() probes /isaac-sim/python.sh β€” present in the
# base image β€” so the validator auto-selects --use-kit at runtime.
# The validator's --use-kit path needs to know WHERE Kit's python lives;
# wire it via SIMREADY_KIT_PYTHON so the auto-detect is fully self-
# configuring (no per-call --kit-python flag needed).
ENV SIMREADY_KIT_PYTHON=/isaac-sim/python.sh
USER 1000:1000
ENV GRADIO_SERVER_NAME=0.0.0.0
ENV GRADIO_SERVER_PORT=7860
EXPOSE 7860
# Clear the Isaac Sim base's ENTRYPOINT (it runs /isaac-sim/runheadless.sh
# and treats CMD as its args β€” fails with 'Permission denied' under
# UID 1000). We invoke the Python app directly; Kit is invoked
# explicitly by the validator via /isaac-sim/python.sh when needed.
ENTRYPOINT []
CMD ["python3.11", "app.py"]