# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 ARG BASE_IMAGE="nvcr.io/nvidia/cuda-dl-base" ARG BASE_IMAGE_TAG="25.10-cuda13.0-devel-ubuntu24.04" ARG PYTORCH_BASE_IMAGE="nvcr.io/nvidia/pytorch" ARG PYTORCH_BASE_IMAGE_TAG="25.10-py3" ARG ENABLE_KVBM=false ARG RUNTIME_IMAGE="nvcr.io/nvidia/cuda-dl-base" ARG RUNTIME_IMAGE_TAG="25.10-cuda13.0-runtime-ubuntu24.04" # TensorRT-LLM specific configuration ARG HAS_TRTLLM_CONTEXT=0 ARG TENSORRTLLM_PIP_WHEEL="tensorrt-llm" ARG TENSORRTLLM_INDEX_URL="https://pypi.nvidia.com/" ARG GITHUB_TRTLLM_COMMIT # Define general architecture ARGs for supporting both x86 and aarch64 builds. # ARCH: Used for package suffixes (e.g., amd64, arm64) # ARCH_ALT: Used for Rust targets, manylinux suffix (e.g., x86_64, aarch64) # # Default values are for x86/amd64: # --build-arg ARCH=amd64 --build-arg ARCH_ALT=x86_64 # # For arm64/aarch64, build with: # --build-arg ARCH=arm64 --build-arg ARCH_ALT=aarch64 # # NOTE: There isn't an easy way to define one of these values based on the other value # without adding if statements everywhere, so just define both as ARGs for now. ARG ARCH=amd64 ARG ARCH_ALT=x86_64 # Python configuration ARG PYTHON_VERSION=3.12 ARG DYNAMO_BASE_IMAGE="dynamo:latest-none" FROM ${DYNAMO_BASE_IMAGE} AS dynamo_base # Copy artifacts from NGC PyTorch image FROM ${PYTORCH_BASE_IMAGE}:${PYTORCH_BASE_IMAGE_TAG} AS pytorch_base ################################################## ########## Framework Builder Stage ############## ################################################## # # PURPOSE: Build TensorRT-LLM with root privileges # # This stage handles TensorRT-LLM installation which requires: # - Root access for apt operations (CUDA repos, TensorRT installation) # - System-level modifications in install_tensorrt.sh # - Virtual environment population with PyTorch and TensorRT-LLM # # The completed venv is then copied to runtime stage with dynamo ownership FROM ${BASE_IMAGE}:${BASE_IMAGE_TAG} AS framework ARG ARCH_ALT ARG PYTHON_VERSION ARG ENABLE_KVBM ENV NIXL_PREFIX=/opt/nvidia/nvda_nixl ENV NIXL_LIB_DIR=$NIXL_PREFIX/lib/${ARCH_ALT}-linux-gnu ENV NIXL_PLUGIN_DIR=$NIXL_LIB_DIR/plugins ENV VIRTUAL_ENV=/opt/dynamo/venv ENV PATH="${VIRTUAL_ENV}/bin:${PATH}" # Install minimal dependencies needed for TensorRT-LLM installation RUN apt-get update && \ DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ python${PYTHON_VERSION}-dev \ python3-pip \ curl \ git \ git-lfs \ ca-certificates && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* # Copy uv COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/ # Create virtual environment RUN mkdir -p /opt/dynamo/venv && \ uv venv /opt/dynamo/venv --python $PYTHON_VERSION # Copy pytorch installation from NGC PyTorch ARG TORCH_VER=2.9.0a0+145a3a7bda.nv25.10 ARG TORCH_TENSORRT_VER=2.9.0a0 ARG TORCHVISION_VER=0.24.0a0+094e7af5 ARG JINJA2_VER=3.1.6 ARG SYMPY_VER=1.14.0 ARG FLASH_ATTN_VER=2.7.4.post1+25.10 COPY --from=pytorch_base /usr/local/lib/python${PYTHON_VERSION}/dist-packages/torch ${VIRTUAL_ENV}/lib/python${PYTHON_VERSION}/site-packages/torch COPY --from=pytorch_base /usr/local/lib/python${PYTHON_VERSION}/dist-packages/torch-${TORCH_VER}.dist-info ${VIRTUAL_ENV}/lib/python${PYTHON_VERSION}/site-packages/torch-${TORCH_VER}.dist-info COPY --from=pytorch_base /usr/local/lib/python${PYTHON_VERSION}/dist-packages/torchgen ${VIRTUAL_ENV}/lib/python${PYTHON_VERSION}/site-packages/torchgen COPY --from=pytorch_base /usr/local/lib/python${PYTHON_VERSION}/dist-packages/torchvision ${VIRTUAL_ENV}/lib/python${PYTHON_VERSION}/site-packages/torchvision COPY --from=pytorch_base /usr/local/lib/python${PYTHON_VERSION}/dist-packages/torchvision-${TORCHVISION_VER}.dist-info ${VIRTUAL_ENV}/lib/python${PYTHON_VERSION}/site-packages/torchvision-${TORCHVISION_VER}.dist-info COPY --from=pytorch_base /usr/local/lib/python${PYTHON_VERSION}/dist-packages/torchvision.libs ${VIRTUAL_ENV}/lib/python${PYTHON_VERSION}/site-packages/torchvision.libs COPY --from=pytorch_base /usr/local/lib/python${PYTHON_VERSION}/dist-packages/functorch ${VIRTUAL_ENV}/lib/python${PYTHON_VERSION}/site-packages/functorch COPY --from=pytorch_base /usr/local/lib/python${PYTHON_VERSION}/dist-packages/jinja2 ${VIRTUAL_ENV}/lib/python${PYTHON_VERSION}/site-packages/jinja2 COPY --from=pytorch_base /usr/local/lib/python${PYTHON_VERSION}/dist-packages/jinja2-${JINJA2_VER}.dist-info ${VIRTUAL_ENV}/lib/python${PYTHON_VERSION}/site-packages/jinja2-${JINJA2_VER}.dist-info COPY --from=pytorch_base /usr/local/lib/python${PYTHON_VERSION}/dist-packages/sympy ${VIRTUAL_ENV}/lib/python${PYTHON_VERSION}/site-packages/sympy COPY --from=pytorch_base /usr/local/lib/python${PYTHON_VERSION}/dist-packages/sympy-${SYMPY_VER}.dist-info ${VIRTUAL_ENV}/lib/python${PYTHON_VERSION}/site-packages/sympy-${SYMPY_VER}.dist-info COPY --from=pytorch_base /usr/local/lib/python${PYTHON_VERSION}/dist-packages/flash_attn ${VIRTUAL_ENV}/lib/python${PYTHON_VERSION}/site-packages/flash_attn COPY --from=pytorch_base /usr/local/lib/python${PYTHON_VERSION}/dist-packages/flash_attn-${FLASH_ATTN_VER}.dist-info ${VIRTUAL_ENV}/lib/python${PYTHON_VERSION}/site-packages/flash_attn-${FLASH_ATTN_VER}.dist-info COPY --from=pytorch_base /usr/local/lib/python${PYTHON_VERSION}/dist-packages/flash_attn_2_cuda.cpython-*-*-linux-gnu.so ${VIRTUAL_ENV}/lib/python${PYTHON_VERSION}/site-packages/ COPY --from=pytorch_base /usr/local/lib/python${PYTHON_VERSION}/dist-packages/torch_tensorrt ${VIRTUAL_ENV}/lib/python${PYTHON_VERSION}/site-packages/torch_tensorrt COPY --from=pytorch_base /usr/local/lib/python${PYTHON_VERSION}/dist-packages/torch_tensorrt-${TORCH_TENSORRT_VER}.dist-info ${VIRTUAL_ENV}/lib/python${PYTHON_VERSION}/site-packages/torch_tensorrt-${TORCH_TENSORRT_VER}.dist-info # Install TensorRT-LLM and related dependencies ARG HAS_TRTLLM_CONTEXT ARG TENSORRTLLM_PIP_WHEEL ARG TENSORRTLLM_INDEX_URL ARG GITHUB_TRTLLM_COMMIT # Copy only wheel files and commit info from trtllm_wheel stage from build_context COPY --from=trtllm_wheel /*.whl /trtllm_wheel/ COPY --from=trtllm_wheel /*.txt /trtllm_wheel/ RUN uv pip install --no-cache "cuda-python==13.0.2" # Note: TensorRT needs to be uninstalled before installing the TRTLLM wheel # because there might be mismatched versions of TensorRT between the NGC PyTorch # and the TRTLLM wheel. RUN [ -f /etc/pip/constraint.txt ] && : > /etc/pip/constraint.txt || true && \ # Clean up any existing conflicting CUDA repository configurations and GPG keys rm -f /etc/apt/sources.list.d/cuda*.list && \ rm -f /usr/share/keyrings/cuda-archive-keyring.gpg && \ rm -f /etc/apt/trusted.gpg.d/cuda*.gpg RUN if [ "$HAS_TRTLLM_CONTEXT" = "1" ]; then \ # Download and run install_tensorrt.sh from TensorRT-LLM GitHub before installing the wheel curl -fsSL --retry 5 --retry-delay 10 --max-time 1800 -o /tmp/install_tensorrt.sh "https://github.com/NVIDIA/TensorRT-LLM/raw/${GITHUB_TRTLLM_COMMIT}/docker/common/install_tensorrt.sh" && \ # Modify the script to use virtual environment pip instead of system pip3 sed -i 's/pip3 install/uv pip install/g' /tmp/install_tensorrt.sh && \ bash /tmp/install_tensorrt.sh && \ # Install from local wheel directory in build context WHEEL_FILE="$(find /trtllm_wheel -name "*.whl" | head -n 1)"; \ if [ -n "$WHEEL_FILE" ]; then \ uv pip install --no-cache "$WHEEL_FILE"; \ else \ echo "No wheel file found in /trtllm_wheel directory."; \ exit 1; \ fi; \ else \ # Download and run install_tensorrt.sh from TensorRT-LLM GitHub before installing the wheel TRTLLM_VERSION=$(echo "${TENSORRTLLM_PIP_WHEEL}" | sed -n 's/.*==\([0-9a-zA-Z\.\-]*\).*/\1/p') && \ (curl -fsSL --retry 5 --retry-delay 10 --max-time 1800 -o /tmp/install_tensorrt.sh "https://github.com/NVIDIA/TensorRT-LLM/raw/v${TRTLLM_VERSION}/docker/common/install_tensorrt.sh" || \ curl -fsSL --retry 5 --retry-delay 10 --max-time 1800 -o /tmp/install_tensorrt.sh "https://github.com/NVIDIA/TensorRT-LLM/raw/${GITHUB_TRTLLM_COMMIT}/docker/common/install_tensorrt.sh") && \ # Modify the script to use virtual environment pip instead of system pip3 sed -i 's/pip3 install/uv pip install/g' /tmp/install_tensorrt.sh && \ bash /tmp/install_tensorrt.sh && \ # Install TensorRT-LLM wheel from the provided index URL, allow dependencies from PyPI # TRTLLM 1.2.0rc2 has issues installing from pypi with uv, installing from direct wheel link works best # explicitly installing triton 3.5.0 as trtllm only lists triton as dependency on x64_64 for some reason export TENSORRTLLM_PIP_WHEEL="https://pypi.nvidia.com/tensorrt-llm/tensorrt_llm-1.2.0rc2-cp312-cp312-linux_${ARCH_ALT}.whl"; \ uv pip install --no-cache --index-strategy=unsafe-best-match --extra-index-url "${TENSORRTLLM_INDEX_URL}" "${TENSORRTLLM_PIP_WHEEL}" triton==3.5.0; \ fi ################################################## ########## Runtime Image ######################## ################################################## # # PURPOSE: Production runtime environment # # This stage creates a lightweight production-ready image containing: # - Pre-compiled TensorRT-LLM and framework dependencies # - Dynamo runtime libraries and Python packages # - Essential runtime dependencies and configurations # - Optimized for inference workloads and deployment # # Use this stage when you need: # - Production deployment of Dynamo with TensorRT-LLM # - Minimal runtime footprint without build tools # - Ready-to-run inference server environment # - Base for custom application containers # FROM ${RUNTIME_IMAGE}:${RUNTIME_IMAGE_TAG} AS runtime ARG ARCH_ALT ARG ENABLE_KVBM ARG PYTHON_VERSION WORKDIR /workspace ENV ENV=${ENV:-/etc/shinit_v2} ENV VIRTUAL_ENV=/opt/dynamo/venv ENV NIXL_PREFIX=/opt/nvidia/nvda_nixl ENV NIXL_LIB_DIR=$NIXL_PREFIX/lib/${ARCH_ALT}-linux-gnu ENV NIXL_PLUGIN_DIR=$NIXL_LIB_DIR/plugins # workaround for pickle lib issue ENV OMPI_MCA_coll_ucc_enable=0 # Use UCX KVCACHE by default ENV TRTLLM_USE_UCX_KVCACHE=1 ARG DYNAMO_COMMIT_SHA ENV DYNAMO_COMMIT_SHA=$DYNAMO_COMMIT_SHA # Install Python, build-essential and python3-dev as apt dependencies RUN if [ ${ARCH_ALT} = "x86_64" ]; then \ ARCH_FOR_GPG=${ARCH_ALT}; \ else \ ARCH_FOR_GPG="sbsa"; \ fi && \ curl -fsSL \ https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2404/${ARCH_FOR_GPG}/cuda-archive-keyring.gpg \ -o /usr/share/keyrings/cuda-archive-keyring.gpg &&\ echo "deb [signed-by=/usr/share/keyrings/cuda-archive-keyring.gpg] \ https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2404/${ARCH_FOR_GPG} /" \ | tee /etc/apt/sources.list.d/cuda.repo.list > /dev/null &&\ apt-get update && \ DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ # Build tools build-essential \ g++ \ ninja-build \ git \ git-lfs \ # Python runtime - CRITICAL for virtual environment to work python${PYTHON_VERSION}-dev \ python3-pip \ # jq for polling various endpoints and health checks jq \ # CUDA/ML libraries libcudnn9-cuda-13 \ libnvshmem3-cuda-13 \ # Network and communication libraries libzmq3-dev \ # RDMA/UCX libraries required to find RDMA devices ibverbs-providers \ ibverbs-utils \ libibumad3 \ libibverbs1 \ libnuma1 \ librdmacm1 \ rdma-core \ # OpenMPI dependencies openssh-client \ openssh-server \ # System utilities and dependencies curl && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* ENV LD_LIBRARY_PATH="/usr/lib/${ARCH_ALT}-linux-gnu/nvshmem/13/:${LD_LIBRARY_PATH}" # Copy CUDA development tools (nvcc, headers, dependencies, etc.) from PyTorch base image COPY --from=pytorch_base /usr/local/cuda/bin/nvcc /usr/local/cuda/bin/nvcc COPY --from=pytorch_base /usr/local/cuda/bin/cudafe++ /usr/local/cuda/bin/cudafe++ COPY --from=pytorch_base /usr/local/cuda/bin/ptxas /usr/local/cuda/bin/ptxas COPY --from=pytorch_base /usr/local/cuda/bin/fatbinary /usr/local/cuda/bin/fatbinary COPY --from=pytorch_base /usr/local/cuda/include/ /usr/local/cuda/include/ COPY --from=pytorch_base /usr/local/cuda/nvvm /usr/local/cuda/nvvm COPY --from=pytorch_base /usr/local/cuda/lib64/libcudart.so* /usr/local/cuda/lib64/ COPY --from=pytorch_base /usr/local/cuda/lib64/libcupti* /usr/local/cuda/lib64/ COPY --from=pytorch_base /usr/local/lib/lib* /usr/local/lib/ COPY --from=pytorch_base /usr/local/cuda/bin/cuobjdump /usr/local/cuda/bin/cuobjdump COPY --from=pytorch_base /usr/local/cuda/bin/nvdisasm /usr/local/cuda/bin/nvdisasm ENV CUDA_HOME=/usr/local/cuda \ TRITON_CUPTI_PATH=/usr/local/cuda/include \ TRITON_CUDACRT_PATH=/usr/local/cuda/include \ TRITON_CUOBJDUMP_PATH=/usr/local/cuda/bin/cuobjdump \ TRITON_NVDISASM_PATH=/usr/local/cuda/bin/nvdisasm \ TRITON_PTXAS_PATH=/usr/local/cuda/bin/ptxas \ TRITON_CUDART_PATH=/usr/local/cuda/include # Copy nats and etcd from dynamo_base image COPY --from=dynamo_base /usr/bin/nats-server /usr/bin/nats-server COPY --from=dynamo_base /usr/local/bin/etcd/ /usr/local/bin/etcd/ # Add ETCD and CUDA binaries to PATH so cicc and other CUDA tools are accessible ENV PATH=/usr/local/bin/etcd/:/usr/local/cuda/nvvm/bin:$PATH # Copy OpenMPI from PyTorch base image COPY --from=pytorch_base /opt/hpcx/ompi /opt/hpcx/ompi # Copy NUMA library from PyTorch base image COPY --from=pytorch_base /usr/lib/${ARCH_ALT}-linux-gnu/libnuma.so* /usr/lib/${ARCH_ALT}-linux-gnu/ # Copy UCX libraries, libucc.so is needed by pytorch. May not need to copy whole hpcx dir but only /opt/hpcx/ucc/ COPY --from=pytorch_base /opt/hpcx /opt/hpcx # This is needed to make libucc.so visible so pytorch can use it. ENV LD_LIBRARY_PATH="/opt/hpcx/ucc/lib:${LD_LIBRARY_PATH}" # Might not need to copy cusparseLt in the future once it's included in DLFW cuda container COPY --from=pytorch_base /usr/local/cuda/lib64/libcusparseLt* /usr/local/cuda/lib64/ # Copy uv to system /bin COPY --from=framework /bin/uv /bin/uvx /bin/ # Copy libgomp.so from framework image COPY --from=framework /usr/local/tensorrt /usr/local/tensorrt COPY --from=framework /usr/lib/${ARCH_ALT}-linux-gnu/libgomp.so* /usr/lib/${ARCH_ALT}-linux-gnu/ # Create dynamo user with group 0 for OpenShift compatibility RUN userdel -r ubuntu > /dev/null 2>&1 || true \ && useradd -m -s /bin/bash -g 0 dynamo \ && [ `id -u dynamo` -eq 1000 ] \ && mkdir -p /home/dynamo/.cache /opt/dynamo \ && chown -R dynamo: /workspace /home/dynamo /opt/dynamo \ && chmod -R g+w /workspace /home/dynamo/.cache /opt/dynamo # Switch to dynamo user USER dynamo ENV HOME=/home/dynamo ENV DYNAMO_HOME=/workspace # Copy UCX from framework image as plugin for NIXL # Copy NIXL source from framework image # Copy dynamo wheels for gitlab artifacts COPY --chown=dynamo: --from=dynamo_base /usr/local/ucx /usr/local/ucx COPY --chown=dynamo: --from=dynamo_base $NIXL_PREFIX $NIXL_PREFIX ENV PATH="/usr/local/ucx/bin:${VIRTUAL_ENV}/bin:/opt/hpcx/ompi/bin:/usr/local/bin/etcd/:/usr/local/cuda/bin:/usr/local/cuda/nvvm/bin:$PATH" ENV LD_LIBRARY_PATH=\ $NIXL_LIB_DIR:\ $NIXL_PLUGIN_DIR:\ /usr/local/ucx/lib:\ /usr/local/ucx/lib/ucx:\ /opt/hpcx/ompi/lib:\ $LD_LIBRARY_PATH ENV OPAL_PREFIX=/opt/hpcx/ompi # Copy pre-built venv with PyTorch and TensorRT-LLM from framework stage COPY --chown=dynamo: --from=framework ${VIRTUAL_ENV} ${VIRTUAL_ENV} ENV TENSORRT_LIB_DIR=/usr/local/tensorrt/targets/${ARCH_ALT}-linux-gnu/lib ENV LD_LIBRARY_PATH=/opt/dynamo/venv/lib/python3.12/site-packages/torch/lib:/opt/dynamo/venv/lib/python3.12/site-packages/torch_tensorrt/lib:${TENSORRT_LIB_DIR}:${LD_LIBRARY_PATH} # Install dynamo, NIXL, and dynamo-specific dependencies COPY --chown=dynamo: benchmarks/ /opt/dynamo/benchmarks/ COPY --chown=dynamo: --from=dynamo_base /opt/dynamo/wheelhouse/ /opt/dynamo/wheelhouse/ RUN uv pip install \ --no-cache \ /opt/dynamo/wheelhouse/ai_dynamo_runtime*.whl \ /opt/dynamo/wheelhouse/ai_dynamo*any.whl \ /opt/dynamo/wheelhouse/nixl/nixl*.whl \ && if [ "${ENABLE_KVBM}" = "true" ]; then \ uv pip install --no-cache /opt/dynamo/wheelhouse/kvbm*.whl; \ fi \ && cd /opt/dynamo/benchmarks \ && UV_GIT_LFS=1 uv pip install --no-cache . \ && cd - \ && rm -rf /opt/dynamo/benchmarks # Install common and test dependencies RUN --mount=type=bind,source=./container/deps/requirements.txt,target=/tmp/requirements.txt \ --mount=type=bind,source=./container/deps/requirements.test.txt,target=/tmp/requirements.test.txt \ UV_GIT_LFS=1 uv pip install \ --no-cache \ --index-strategy unsafe-best-match \ --extra-index-url https://download.pytorch.org/whl/cu130 \ --requirement /tmp/requirements.txt \ --requirement /tmp/requirements.test.txt \ cupy-cuda13x # Copy tests, benchmarks, deploy and components for CI with correct ownership COPY --chown=dynamo: tests /workspace/tests COPY --chown=dynamo: examples /workspace/examples COPY --chown=dynamo: benchmarks /workspace/benchmarks COPY --chown=dynamo: deploy /workspace/deploy COPY --chown=dynamo: components/ /workspace/components/ COPY --chown=dynamo: recipes/ /workspace/recipes/ # Copy attribution files with correct ownership COPY --chown=dynamo: ATTRIBUTION* LICENSE /workspace/ # Setup launch banner in common directory accessible to all users RUN --mount=type=bind,source=./container/launch_message/runtime.txt,target=/opt/dynamo/launch_message.txt \ sed '/^#\s/d' /opt/dynamo/launch_message.txt > /opt/dynamo/.launch_screen # Setup environment for all users USER root RUN chmod 755 /opt/dynamo/.launch_screen && \ echo 'source /opt/dynamo/venv/bin/activate' >> /etc/bash.bashrc && \ echo 'cat /opt/dynamo/.launch_screen' >> /etc/bash.bashrc USER dynamo ENTRYPOINT ["/opt/nvidia/nvidia_entrypoint.sh"] CMD [] ########################################################### ########## Development (run.sh, runs as root user) ######## ########################################################### # # PURPOSE: Local development environment for use with run.sh (not Dev Container plug-in) # # This stage runs as root and provides: # - Development tools and utilities for local debugging # - Support for vscode/cursor development outside the Dev Container plug-in # # Use this stage if you need a full-featured development environment with extra tools, # but do not use it with the Dev Container plug-in. FROM runtime AS dev # Don't want ubuntu to be editable, just change uid and gid. ARG WORKSPACE_DIR=/workspace # Switch to root for system package installation USER root # Install utilities as root RUN apt-get update -y && \ apt-get install -y --no-install-recommends \ # Install utilities nvtop \ wget \ tmux \ vim \ git \ iproute2 \ rsync \ zip \ unzip \ htop \ # Build Dependencies autoconf \ automake \ cmake \ libtool \ meson \ net-tools \ pybind11-dev \ # Rust build dependencies clang \ libclang-dev \ protobuf-compiler && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* # Set workspace directory variable ENV WORKSPACE_DIR=${WORKSPACE_DIR} \ DYNAMO_HOME=${WORKSPACE_DIR} \ RUSTUP_HOME=/usr/local/rustup \ CARGO_HOME=/usr/local/cargo \ CARGO_TARGET_DIR=/workspace/target \ VIRTUAL_ENV=/opt/dynamo/venv \ PATH=/usr/local/cargo/bin:$PATH COPY --from=dynamo_base /usr/local/rustup /usr/local/rustup COPY --from=dynamo_base /usr/local/cargo /usr/local/cargo # Install maturin, for maturin develop RUN uv pip install --no-cache maturin[patchelf] # Editable install of dynamo COPY pyproject.toml README.md hatch_build.py /workspace/ RUN uv pip install --no-cache --no-deps -e . CMD []