# This file describes an image that has everything necessary installed to build a target ROS workspace # It uses QEmu user-mode emulation to perform dependency installation and build # Assumptions: qemu-user-static directory is present in docker build context ARG BASE_IMAGE FROM ${BASE_IMAGE} ARG ROS_VERSION ARG ROS_DISTRO SHELL ["/bin/bash", "-c"] # Set timezone RUN echo 'Etc/UTC' > /etc/timezone && \ ln -sf /usr/share/zoneinfo/Etc/UTC /etc/localtime RUN apt-get update && apt-get install --no-install-recommends -y \ tzdata \ locales \ vim \ && rm -rf /var/lib/apt/lists/* # Set locale RUN echo 'en_US.UTF-8 UTF-8' >> /etc/locale.gen && \ locale-gen && \ update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 ENV LANG en_US.UTF-8 ENV LC_ALL C.UTF-8 # Add the ros apt repo RUN apt-get update && apt-get install --no-install-recommends -y \ ca-certificates \ curl wget git \ dirmngr \ gnupg2 \ lsb-release \ && rm -rf /var/lib/apt/lists/* RUN if [[ "${ROS_VERSION}" == "ros2" ]]; then \ curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg; \ echo "deb [signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/${ROS_VERSION}/ubuntu `lsb_release -cs` main" | \ tee /etc/apt/sources.list.d/ros2.list > /dev/null; \ else \ curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | apt-key add - ; \ echo "deb http://packages.ros.org/${ROS_VERSION}/ubuntu `lsb_release -cs` main" \ > /etc/apt/sources.list.d/${ROS_VERSION}-latest.list; \ fi # ROS dependencies RUN apt-get update && apt-get install --no-install-recommends -y \ build-essential \ cmake libpcre2-dev \ python3-colcon-common-extensions \ python3-colcon-mixin \ python3-dev \ python3-pip \ python3-lark-parser \ && rm -rf /var/lib/apt/lists/* RUN python3 -m pip install -U \ setuptools # Install some pip packages needed for testing ROS 2 RUN if [[ "${ROS_VERSION}" == "ros2" ]]; then \ python3 -m pip install -U \ flake8 \ flake8-blind-except \ flake8-builtins \ flake8-class-newline \ flake8-comprehensions \ flake8-deprecated \ flake8-docstrings \ flake8-import-order \ flake8-quotes \ pytest-repeat \ pytest-rerunfailures \ pytest \ pytest-cov \ pytest-runner \ ; fi # Install Fast-RTPS dependencies for ROS 2 RUN if [[ "${ROS_VERSION}" == "ros2" ]]; then \ apt-get update && apt-get install --no-install-recommends -y \ libasio-dev \ libtinyxml2-dev \ && rm -rf /var/lib/apt/lists/* \ ; fi RUN python3 -m pip install -U vcstool colcon-common-extensions numpy # Run arbitrary user setup (copy data and run script) # COPY user-custom-data/ custom-data/ # COPY user-custom-setup . # RUN chmod +x ./user-custom-setup && \ # ./user-custom-setup && \ # rm -rf /var/lib/apt/lists/* # mixins defines building environments COPY mixins /root RUN mkdir -p /buildroot /opt/ros/${ROS_DISTRO}/src WORKDIR /opt/ros/${ROS_DISTRO} # Disable packages # - rviz, X11/desktop required, if you want rviz, trying arm Ubuntu 18.04 # - turtlesim, QT5 required RUN wget https://raw.githubusercontent.com/ros2/ros2/${ROS_DISTRO}/ros2.repos && \ vcs-import src < ros2.repos RUN git clone https://github.com/ros2/cross_compile.git -b 0.9.0 /tmp/cross_compile && \ cp /tmp/cross_compile/ros_cross_compile/qemu/qemu-aarch64-static /usr/bin && \ cp /tmp/cross_compile/ros_cross_compile/qemu/qemu-arm-static /usr/bin && \ rm -rf /tmp/cross_compile RUN if [[ -e src/ros-visualization ]]; then \ touch src/ros-visualization/COLCON_IGNORE ; \ echo "IGNORE ros-visualization"; \ fi RUN if [[ -e src/ros2/rviz ]]; then \ touch src/ros2/rviz/COLCON_IGNORE ; \ echo "IGNORE ros2/rviz"; \ fi RUN if [[ -e src/ros/ros_tutorials/turtlesim ]]; then \ touch src/ros/ros_tutorials/turtlesim/COLCON_IGNORE; \ echo "IGNORE ros_tutorials/turtlesim"; \ fi RUN if [[ -e src/eclipse-iceoryx ]]; then \ touch src/eclipse-iceoryx/COLCON_IGNORE; \ echo "IGNORE eclipse-iceoryx"; \ fi RUN if [[ -e src/eclipse-cyclonedds ]]; then \ touch src/eclipse-cyclonedds/COLCON_IGNORE; \ echo "IGNORE eclipse-cyclonedds"; \ fi COPY build_ros2.sh /opt/ros/${ROS_DISTRO} RUN ln -s /opt/ros/${ROS_DISTRO}/build_ros2.sh /root RUN sed -i "s/^ROS_DISTRO=.*$/ROS_DISTRO=${ROS_DISTRO}/" /root/build_ros2.sh ENTRYPOINT ["/root/build_ros2.sh"]