| |
| |
| FROM nvidia/cuda:12.4.0-runtime-ubuntu22.04 |
|
|
| |
| ARG TARGETPLATFORM |
| ARG BUILDPLATFORM |
| RUN echo "Building for $TARGETPLATFORM on $BUILDPLATFORM" |
|
|
| |
| ENV DEBIAN_FRONTEND=noninteractive |
|
|
| |
| RUN apt-get update && \ |
| apt-get install -y \ |
| |
| build-essential \ |
| curl \ |
| gdb \ |
| git \ |
| git-lfs \ |
| net-tools \ |
| sudo \ |
| wget \ |
| iputils-ping \ |
| vim \ |
| unzip \ |
| |
| udev \ |
| |
| libgl1-mesa-dri \ |
| libgl1-mesa-glx \ |
| libglu1-mesa \ |
| mesa-utils \ |
| libxcb-cursor0 \ |
| x11-apps \ |
| xauth \ |
| |
| libegl1 \ |
| libegl1-mesa \ |
| libegl1-mesa-dev \ |
| libgl1-mesa-dev \ |
| libgles2-mesa-dev \ |
| libglvnd-dev \ |
| mesa-common-dev \ |
| |
| libxcb-icccm4 \ |
| libxcb-image0 \ |
| libxcb-keysyms1 \ |
| libxcb-randr0 \ |
| libxcb-render-util0 \ |
| libxcb-shape0 \ |
| libxcb-xfixes0 \ |
| libxcb-xinerama0 \ |
| libxcb-xinput0 \ |
| libxcb-xkb1 \ |
| libxkbcommon-x11-0 \ |
| |
| libdbus-1-3 \ |
| |
| libncurses5-dev \ |
| libudev-dev \ |
| libusb-1.0-0-dev \ |
| |
| python3.10 \ |
| python3.10-venv \ |
| python3.10-distutils \ |
| python3-pip \ |
| expect \ |
| |
| ffmpeg \ |
| libavcodec-dev \ |
| libavformat-dev \ |
| libavdevice-dev \ |
| libavfilter-dev \ |
| libavutil-dev \ |
| libswresample-dev \ |
| libswscale-dev \ |
| |
| libgtk2.0-dev \ |
| |
| && rm -rf /var/lib/apt/lists/* |
|
|
| |
| |
| RUN apt-get update && apt-get install -y software-properties-common \ |
| && add-apt-repository universe \ |
| |
| && apt-get install -y curl gnupg lsb-release \ |
| && curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg \ |
| && echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(. /etc/os-release && echo $UBUNTU_CODENAME) main" > /etc/apt/sources.list.d/ros2.list \ |
| # Upgrade system to avoid removal of critical packages (see ROS 2 docs) |
| && apt-get update \ |
| && apt-get upgrade -y \ |
| # Install ROS 2 Humble desktop |
| && apt-get install -y ros-humble-desktop \ |
| # (Optional) Install development tools |
| && apt-get install -y ros-dev-tools \ |
| # Install Eclipse Cyclone DDS RMW implementation |
| && apt-get install -y ros-humble-rmw-cyclonedds-cpp \ |
| # Clean up |
| && rm -rf /var/lib/apt/lists/* |
| |
| # Source ROS 2 setup in bashrc for all users |
| RUN echo 'source /opt/ros/humble/setup.bash' >> /etc/bash.bashrc |
| |
| # Clone, build, and install CycloneDDS 0.10.x |
| RUN git clone --branch releases/0.10.x https://github.com/eclipse-cyclonedds/cyclonedds /opt/cyclonedds && \ |
| mkdir -p /opt/cyclonedds/build /opt/cyclonedds/install && \ |
| cd /opt/cyclonedds/build && \ |
| cmake .. -DCMAKE_INSTALL_PREFIX=../install && \ |
| cmake --build . --target install && \ |
| # Clean up build files to reduce image size |
| rm -rf /opt/cyclonedds/build |
| |
| # Set CYCLONEDDS_HOME for all users |
| ENV CYCLONEDDS_HOME=/opt/cyclonedds/install |
| |
| # Install uv |
| RUN curl -LsSf https://astral.sh/uv/install.sh | env UV_INSTALL_DIR=/opt/uv sh |
| |
| # Add uv to PATH |
| ENV PATH="/opt/uv:$PATH" |
| ENV UV_PYTHON=/opt/venv/bin/python |
| |
| # Fix dpkg state and install tmux |
| RUN dpkg --configure -a && apt-get update && apt-get install -y tmux && rm -rf /var/lib/apt/lists/* |
| |
| # Create NVIDIA ICD config for EGL if it doesn't exist |
| # Note: This might need platform-specific handling for ARM64 |
| RUN if [ ! -f /usr/share/glvnd/egl_vendor.d/10_nvidia.json ]; then \ |
| mkdir -p /usr/share/glvnd/egl_vendor.d && \ |
| printf '{\n "file_format_version" : "1.0.0",\n "ICD" : {\n "library_path" : "libEGL_nvidia.so.0"\n }\n}' | tee /usr/share/glvnd/egl_vendor.d/10_nvidia.json > /dev/null; \ |
| fi |
| |
| # Platform-specific configurations |
| RUN case "$TARGETPLATFORM" in \ |
| "linux/arm64") \ |
| echo "Configuring for ARM64 platform" && \ |
| # Add any ARM64-specific configurations here |
| echo "export GPU_FORCE_64BIT_PTR=1" >> /etc/environment \ |
| ;; \ |
| "linux/amd64") \ |
| echo "Configuring for AMD64 platform" && \ |
| # Add any AMD64-specific configurations here |
| echo "AMD64 platform configured" \ |
| ;; \ |
| *) \ |
| echo "Unknown platform: $TARGETPLATFORM" \ |
| ;; \ |
| esac |
| |
| # Add labels for better image management |
| LABEL org.opencontainers.image.title="Multi-Arch CUDA Runtime with ROS 2 Humble" |
| LABEL org.opencontainers.image.description="Multi-architecture Docker image with CUDA runtime and ROS 2 Humble" |
| |