| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| FROM nvidia/cuda:12.8.0-devel-ubuntu24.04 |
|
|
| SHELL ["/bin/bash", "-c"] |
|
|
| ENV DEBIAN_FRONTEND=noninteractive \ |
| NVIDIA_DRIVER_CAPABILITIES=graphics,utility,compute \ |
| GR00T_GLOBAL_VENV=/opt/gr00t-venv \ |
| UV_PROJECT_ENVIRONMENT=/opt/gr00t-venv \ |
| PYTHON=/usr/bin/python \ |
| CUDA_HOME=/usr/local/cuda \ |
| PATH=/usr/local/cuda/bin:${PATH} \ |
| LD_LIBRARY_PATH=/usr/local/cuda/lib64:${LD_LIBRARY_PATH} |
|
|
| |
| RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ |
| --mount=type=cache,target=/var/lib/apt,sharing=locked <<INNEREOF |
| set -euo pipefail |
| APT_RETRY_OPTS=( |
| -o Acquire::Retries=5 |
| -o Acquire::http::Timeout=30 |
| -o Acquire::https::Timeout=30 |
| ) |
| |
| |
| |
| find /etc/apt -type f \( -name '*.list' -o -name '*.sources' \) -exec sed -i \ |
| -e 's|http://archive.ubuntu.com/ubuntu|https://archive.ubuntu.com/ubuntu|g' \ |
| -e 's|http://security.ubuntu.com/ubuntu|https://security.ubuntu.com/ubuntu|g' \ |
| {} + |
|
|
| apt_update() { |
| for attempt in 1 2 3 4 5; do |
| if apt-get "${APT_RETRY_OPTS[@]}" update \ |
| -o APT::Update::Error-Mode=any; then |
| return 0 |
| fi |
| rm -rf /var/lib/apt/lists/* |
| sleep $((attempt * 10)) |
| done |
| return 1 |
| } |
|
|
| apt_update |
|
|
| apt_install_retry() { |
| for attempt in 1 2 3 4 5; do |
| if apt-get "${APT_RETRY_OPTS[@]}" install -y --no-install-recommends \ |
| build-essential \ |
| ca-certificates \ |
| git \ |
| git-lfs \ |
| curl \ |
| wget \ |
| python3.12 \ |
| python3.12-venv \ |
| python3.12-dev \ |
| python3-pip \ |
| python-is-python3 \ |
| software-properties-common \ |
| cmake \ |
| ninja-build \ |
| pkg-config \ |
| pybind11-dev \ |
| ffmpeg \ |
| libavdevice-dev \ |
| libavfilter-dev \ |
| libavformat-dev \ |
| libavcodec-dev \ |
| libavutil-dev \ |
| libswresample-dev \ |
| libswscale-dev \ |
| libegl1; then |
| return 0 |
| fi |
| if [ "$attempt" != "5" ]; then |
| rm -rf /var/lib/apt/lists/* |
| apt_update || true |
| sleep $((attempt * 10)) |
| fi |
| done |
| return 1 |
| } |
|
|
| apt_install_retry |
|
|
| |
| |
| |
| |
| add_python310_retry() { |
| for attempt in 1 2 3 4 5; do |
| if add-apt-repository -y ppa:deadsnakes/ppa \ |
| && apt_update \ |
| && apt-get "${APT_RETRY_OPTS[@]}" install -y --no-install-recommends \ |
| python3.10 \ |
| python3.10-venv \ |
| python3.10-dev; then |
| return 0 |
| fi |
| if [ "$attempt" != "5" ]; then |
| rm -rf /var/lib/apt/lists/* |
| apt_update || true |
| sleep $((attempt * 10)) |
| fi |
| done |
| return 1 |
| } |
|
|
| add_python310_retry |
|
|
| pip_install_retry() { |
| for attempt in 1 2 3 4 5; do |
| |
| |
| |
| |
| if python -m pip install --upgrade --retries 5 --break-system-packages --ignore-installed pip setuptools wheel; then |
| return 0 |
| fi |
| sleep $((attempt * 10)) |
| done |
| return 1 |
| } |
|
|
| pip_install_retry |
|
|
| curl --retry 5 --retry-delay 10 --retry-max-time 300 -LsSf https://astral.sh/uv/0.8.14/install.sh | env UV_INSTALL_DIR=/usr/local/bin sh |
| INNEREOF |
|
|
| WORKDIR /tmp/gr00t-venv-build |
|
|
| |
| |
| |
| COPY pyproject.toml uv.lock ./ |
| COPY scripts/deployment/dgpu/bootstrap_wheels.sh ./scripts/deployment/dgpu/bootstrap_wheels.sh |
| COPY scripts/deployment/dgpu/wheels/ ./scripts/deployment/dgpu/wheels/ |
|
|
| RUN <<INNEREOF |
| set -euo pipefail |
|
|
| uv_lock_retry() { |
| for attempt in 1 2 3 4 5; do |
| if UV_PREVIEW=1 UV_HTTP_TIMEOUT=300 UV_CONCURRENT_DOWNLOADS=4 uv lock; then |
| return 0 |
| fi |
| sleep $((attempt * 10)) |
| done |
| return 1 |
| } |
|
|
| uv_sync_retry() { |
| for attempt in 1 2 3 4 5; do |
| if UV_PREVIEW=1 UV_HTTP_TIMEOUT=300 UV_CONCURRENT_DOWNLOADS=4 uv sync --frozen --no-install-project --extra dev --no-cache; then |
| return 0 |
| fi |
| sleep $((attempt * 10)) |
| done |
| return 1 |
| } |
|
|
| if [ "$(uname -m)" = "aarch64" ]; then |
| bash scripts/deployment/dgpu/bootstrap_wheels.sh |
| uv_lock_retry |
| fi |
|
|
| uv_sync_retry |
| sha256sum uv.lock | awk '{print $1}' > "${GR00T_GLOBAL_VENV}/.gr00t-uv-lock.sha256" |
| mkdir -p /opt/gr00t-image-metadata |
| cp pyproject.toml uv.lock /opt/gr00t-image-metadata/ |
| cd / |
| rm -rf /tmp/gr00t-venv-build |
| INNEREOF |
|
|
| WORKDIR / |
| RUN mkdir -p /workspace && ln -sfn "${GR00T_GLOBAL_VENV}" /workspace/.venv |
| WORKDIR /workspace |
|
|
| ENV PATH="${GR00T_GLOBAL_VENV}/bin:${PATH}" \ |
| VIRTUAL_ENV="${GR00T_GLOBAL_VENV}" |
|
|
| |
| RUN mkdir -p /usr/share/glvnd/egl_vendor.d && \ |
| cat >/usr/share/glvnd/egl_vendor.d/10_nvidia.json <<'JSONEOF' |
| { |
| "file_format_version" : "1.0.0", |
| "ICD" : { |
| "library_path" : "libEGL_nvidia.so.0" |
| } |
| } |
| JSONEOF |
|
|
| RUN mkdir -p /usr/share/vulkan/icd.d && \ |
| cat >/usr/share/vulkan/icd.d/nvidia_icd.json <<'JSONEOF' |
| { |
| "file_format_version": "1.0.0", |
| "ICD": { |
| "library_path": "libGLX_nvidia.so.0", |
| "api_version": "1.2.140" |
| } |
| } |
| JSONEOF |
|
|
| ENV MUJOCO_GL="egl" \ |
| PYOPENGL_PLATFORM="egl" \ |
| __EGL_VENDOR_LIBRARY_FILENAMES="/usr/share/glvnd/egl_vendor.d/10_nvidia.json" |
|
|
| |
| |
| |
| |
|
|
| CMD ["/bin/bash"] |
|
|