1- FROM nvidia/cuda:11.6.2-cudnn8-devel-ubuntu20.04
2-
3- # Set noninteractive mode for apt-get
4- ENV DEBIAN_FRONTEND=noninteractive
5-
6- # Preconfigure tzdata
7- RUN echo "Etc/UTC" > /etc/timezone && \
8- ln -fs /usr/share/zoneinfo/Etc/UTC /etc/localtime && \
9- apt-get update && apt-get install -y tzdata && \
10- dpkg-reconfigure --frontend noninteractive tzdata
11-
12- # Install Python
13- RUN apt-get update && apt-get install -y \
14- python3.8 \
15- python3-pip \
16- git
17-
18- # Install PyTorch
19- COPY requirements.txt /tmp/requirements.txt
20- RUN pip3 install -r /tmp/requirements.txt
21- RUN pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
22-
23- # Install other Python packages
24- RUN pip3 install cupy-cuda11x scikit-learn
25- RUN pip3 install 'git+https://github.com/facebookresearch/detectron2.git'
26-
27- # Install ROS
28- RUN apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
29- RUN sh -c 'echo "deb http://packages.ros.org/ros/ubuntu focal main" > /etc/apt/sources.list.d/ros-latest.list'
30-
31- RUN apt-get update && apt-get install -y --no-install-recommends \
32- ros-noetic-desktop-full
33-
34- # Install ROS packages
35- RUN apt install -y ros-noetic-pybind11-catkin \
36- ros-noetic-grid-map-core ros-noetic-grid-map-msgs ros-noetic-grid-map-ros ros-noetic-grid-map-rviz-plugin \
37- libopencv-dev \
38- libeigen3-dev \
39- libgmp-dev \
40- libmpfr-dev \
41- libboost-all-dev \
42- ros-noetic-turtlebot3-gazebo ros-noetic-turtlebot3-teleop \
43- ros-noetic-ros-numpy
44-
45- RUN pip3 install catkin-tools
46- ENV TURTLEBOT3_MODEL=waffle
1+ # syntax=docker/dockerfile:1.4
2+
3+ # Base image
4+ FROM nvidia/cuda:12.1.1-cudnn8-devel-ubuntu22.04 AS base
5+
6+ # Metadata
7+ LABEL description="ROS2 environment with CUDA support"
8+ LABEL version="1.0"
9+
10+ # Build arguments
11+ ARG ROS_DISTRO=humble
12+ ARG USERNAME=ros
13+ ARG USER_UID=1000
14+ ARG USER_GID=$USER_UID
15+ ARG RMW_NAME=zenoh
16+
17+ # Environment variables
18+ ENV DEBIAN_FRONTEND=noninteractive \
19+ LANG=en_US.UTF-8 \
20+ LC_ALL=${LANG}\
21+ TZ=UTC \
22+ PYTHONUNBUFFERED=1 \
23+ ROS_DISTRO=${ROS_DISTRO} \
24+ ROS_ROOT=/opt/ros/${ROS_DISTRO} \
25+ AMENT_PREFIX_PATH=/opt/ros/${ROS_DISTRO} \
26+ COLCON_PREFIX_PATH=/opt/ros/${ROS_DISTRO} \
27+ LD_LIBRARY_PATH=/opt/ros/${ROS_DISTRO}/lib:/usr/local/cuda/lib64 \
28+ PATH=/opt/ros/${ROS_DISTRO}/bin:/usr/src/tensorrt/bin:/usr/local/cuda/bin:$PATH \
29+ PYTHONPATH=/opt/ros/${ROS_DISTRO}/lib/python3.10/site-packages \
30+ # Used by various ROS2 packages
31+ RMW_IMPLEMENTATION=rmw_${RMW_NAME}_cpp \
32+ # Should be the same as above but with dashes instead of underscores
33+ RMW_IMPLEMENTATION_DASH=rmw-${RMW_NAME}-cpp
34+
35+ # Install basic utilities and dependencies
36+ RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
37+ apt update && apt install -y --no-install-recommends \
38+ locales \
39+ tzdata \
40+ curl \
41+ gnupg2 \
42+ lsb-release \
43+ sudo \
44+ software-properties-common \
45+ wget \
46+ git \
47+ git-lfs \
48+ nano \
49+ && locale-gen ${LANG} \
50+ && update-locale LC_ALL=${LC_ALL} LANG=${LANG}\
51+ && ln -fs /usr/share/zoneinfo/${TZ} /etc/localtime \
52+ && dpkg-reconfigure -f ${DEBIAN_FRONTEND} tzdata \
53+ && apt clean \
54+ && rm -rf /var/lib/apt/lists/*
55+
56+ # Install ROS2
57+ RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
58+ curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg \
59+ && 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" | tee /etc/apt/sources.list.d/ros2.list > /dev/null \
60+ && apt update && apt install -y --no-install-recommends \
61+ ros-${ROS_DISTRO}-ros-base \
62+ python3-argcomplete \
63+ ros-${ROS_DISTRO}-${RMW_IMPLEMENTATION_DASH} \
64+ && apt clean \
65+ && rm -rf /var/lib/apt/lists/*
66+
67+ # Development stage
68+ FROM base AS dev
69+
70+ # Install development tools and dependencies
71+ RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
72+ apt update && apt install -y --no-install-recommends \
73+ bash-completion \
74+ build-essential \
75+ cmake \
76+ gdb \
77+ openssh-client \
78+ python3-pip \
79+ vim \
80+ doxygen \
81+ graphviz \
82+ python3-sphinx \
83+ python3-breathe \
84+ ros-dev-tools \
85+ ros-${ROS_DISTRO}-ament-* \
86+ python3-rosdep \
87+ libxine2-dev \
88+ libtiff5-dev \
89+ libpostproc-dev \
90+ libopencv-dev \
91+ && apt clean \
92+ && rm -rf /var/lib/apt/lists/*
93+
94+ # Initialize rosdep
95+ RUN rosdep init && rosdep update
96+
97+ # Pytorch
98+ # Used by elevation_mapping_cupy
99+ RUN python3 -m pip install -U --extra-index-url https://download.pytorch.org/whl/cu121 \
100+ torch \
101+ torchvision \
102+ torchaudio
103+
104+ # Install Python packages
105+ RUN python3 -m pip install \
106+ # colcon extension to enable easier workspace cleaning
107+ colcon-clean\
108+ # Almost all ros2 packages
109+ rosdoc2\
110+ # sphinx is used across packages for documentation
111+ sphinx_rtd_theme \
112+ sphinx-multiversion \
113+ sphinx-copybutton\
114+ sphinx-tabs\
115+ # For VS Code python code formatting I think?
116+ autopep8\
117+ # Used by multiple packages for linting I think?
118+ flake8-builtins\
119+ flake8-comprehensions\
120+ flake8-docstrings\
121+ flake8-import-order\
122+ flake8-class-newline\
123+ flake8-blind-except\
124+ flake8-quotes\
125+ # For Python code formatting. Not sure what package uses it
126+ # black==21.12b0\
127+ #### For elevation_mapping_cupy ####
128+ ruamel.yaml\
129+ scikit-learn\
130+ shapely\
131+ opencv-python\
132+ cupy-cuda12x\
133+ scipy\
134+ simple-parsing\
135+ "numpy<2.0.0"
136+
137+ # Needed for elevation_mapping_cupy to not have run-time errors
138+ RUN python3 -m pip install transforms3d -U
139+
140+ # Set up non-root user
141+ RUN groupadd --gid $USER_GID $USERNAME \
142+ && useradd -s /bin/bash --uid $USER_UID --gid $USER_GID -m $USERNAME \
143+ && echo $USERNAME ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/$USERNAME \
144+ && chmod 0440 /etc/sudoers.d/$USERNAME
145+
146+ # Set up autocompletion and source ROS environment for user
147+ RUN echo "source /opt/ros/${ROS_DISTRO}/setup.bash" >> /home/$USERNAME/.bashrc \
148+ && echo "source /usr/share/colcon_argcomplete/hook/colcon-argcomplete.bash" >> /home/$USERNAME/.bashrc
149+
150+ # For building GPU supported containers?
151+ # Install NVIDIA Container Toolkit
152+ RUN distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
153+ && curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - \
154+ && curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list \
155+ && apt update && apt install -y nvidia-container-toolkit \
156+ && apt clean \
157+ && rm -rf /var/lib/apt/lists/*
158+
159+ RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
160+ apt update && apt install -y --no-install-recommends \
161+ # For elevation_mapping_cupy
162+ libboost-all-dev\
163+ && apt clean && \
164+ rm -rf /var/lib/apt/lists/*
165+
166+ RUN apt update && \
167+ DEBIAN_FRONTEND=${DEBIAN_FRONTEND} apt install -y \
168+ #### For elevation_mapping_cupy ####
169+ ros-${ROS_DISTRO}-grid-map-msgs\
170+ ros-${ROS_DISTRO}-grid-map-ros\
171+ ros-${ROS_DISTRO}-image-transport\
172+ ros-${ROS_DISTRO}-pcl-ros\
173+ ros-${ROS_DISTRO}-cv-bridge\
174+ ros-${ROS_DISTRO}-tf-transformations\
175+ ros-${ROS_DISTRO}-rviz2\
176+ ros-${ROS_DISTRO}-gazebo-ros\
177+ ros-${ROS_DISTRO}-grid-map-cv\
178+ ros-${ROS_DISTRO}-grid-map-core\
179+ ros-${ROS_DISTRO}-grid-map-demos\
180+ ##################################
181+ #### For debugging elevation_mapping_cupy by setting up turtlebot3_simulations####
182+ # ros-${ROS_DISTRO}-turtlebot3*\
183+ ros-${ROS_DISTRO}-camera-calibration-parsers\
184+ ros-${ROS_DISTRO}-camera-info-manager\
185+ ros-${ROS_DISTRO}-gazebo-plugins\
186+ ros-${ROS_DISTRO}-turtlebot3-msgs\
187+ ros-${ROS_DISTRO}-turtlebot3-teleop\
188+ ros-${ROS_DISTRO}-gazebo-ros-pkgs\
189+ ##############################################
190+ && apt clean && \
191+ rm -rf /var/lib/apt/lists/*
192+
193+
194+ # Switch to non-root user
195+ USER $USERNAME
196+
197+ # Health check
198+ HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
199+ CMD ros2 topic list > /dev/null 2>&1 || exit 1
200+
201+ # Set ID to value not used by others on your network
202+ ENV ROS_DOMAIN_ID=12
203+
204+ # For elevation_mapping_cupy
205+ ENV TURTLEBOT3_MODEL=waffle_realsense_depth
206+
207+ # Set the default command to bash
208+ CMD ["bash"]
0 commit comments