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