/
/
/
1ARG ROS_DISTRO=humble
2
3FROM ros:${ROS_DISTRO}-ros-base AS builder
4
5RUN apt-get update && apt-get install -y --no-install-recommends \
6 build-essential \
7 cmake \
8 git \
9 python3-rosdep \
10 && rm -rf /var/lib/apt/lists/*
11
12# Install Crow (header-only web framework) - not available via rosdep
13RUN apt-get update && apt-get install -y --no-install-recommends \
14 libasio-dev \
15 libboost-system-dev \
16 libboost-date-time-dev \
17 && rm -rf /var/lib/apt/lists/* \
18 && git clone --depth 1 --branch v1.0+5 https://github.com/CrowCpp/Crow.git /tmp/crow \
19 && cd /tmp/crow \
20 && mkdir build && cd build \
21 && cmake .. -DCROW_BUILD_EXAMPLES=OFF -DCROW_BUILD_TESTS=OFF \
22 && make install \
23 && rm -rf /tmp/crow
24
25WORKDIR /ros2_ws/src
26
27COPY . bag_recorder_backend/
28
29WORKDIR /ros2_ws
30RUN apt-get update \
31 && rosdep update \
32 && rosdep install --from-paths src --ignore-src -r -y \
33 && rm -rf /var/lib/apt/lists/*
34
35# Build the package
36RUN . /opt/ros/${ROS_DISTRO}/setup.sh && \
37 colcon build --packages-select bag_recorder_backend \
38 --cmake-args -DCMAKE_BUILD_TYPE=Release
39
40FROM ros:${ROS_DISTRO}-ros-base AS runtime
41
42# Install runtime dependencies only
43RUN apt-get update && apt-get install -y --no-install-recommends \
44 ros-${ROS_DISTRO}-rosbag2-cpp \
45 ros-${ROS_DISTRO}-rosbag2-storage \
46 ros-${ROS_DISTRO}-rosbag2-storage-default-plugins \
47 tar \
48 && rm -rf /var/lib/apt/lists/*
49
50# Copy built artifacts from builder stage
51COPY --from=builder /ros2_ws/install /ros2_ws/install
52
53# Create default output directory
54RUN mkdir -p /tmp/rosbags && chmod 755 /tmp/rosbags
55
56# Create non-root user for security
57RUN useradd -m -s /bin/bash rosuser && \
58 chown -R rosuser:rosuser /tmp/rosbags
59
60# Environment variables
61ENV SERVER_PORT=8080
62ENV OUTPUT_DIR=/tmp/rosbags
63ENV ROS_DOMAIN_ID=0
64
65# Expose the server port
66EXPOSE 8080
67
68# Setup entrypoint
69COPY <<'EOF' /entrypoint.sh
70#!/bin/bash
71set -e
72
73# Source ROS2 setup
74source /opt/ros/${ROS_DISTRO}/setup.bash
75source /ros2_ws/install/setup.bash
76
77# Run the bag recorder node with parameters
78exec ros2 run bag_recorder_backend bag_recorder_node --ros-args \
79 -p server_port:=${SERVER_PORT} \
80 -p output_directory:=${OUTPUT_DIR} \
81 -p enable_cors:=true
82EOF
83
84RUN chmod +x /entrypoint.sh
85
86# Run as non-root user
87USER rosuser
88
89ENTRYPOINT ["/entrypoint.sh"]
90