FROM ros:noetic-ros-base
# Prevent interactive prompts during package installation
ENV DEBIAN_FRONTEND=noninteractive
ENV TZ=Etc/UTC
# Install build dependencies for Python 3.10
RUN apt-get update && apt-get install -y --no-install-recommends \
build-essential \
curl \
tzdata \
libssl-dev \
zlib1g-dev \
libbz2-dev \
libreadline-dev \
libsqlite3-dev \
libncursesw5-dev \
xz-utils \
tk-dev \
libxml2-dev \
libxmlsec1-dev \
libffi-dev \
liblzma-dev \
&& rm -rf /var/lib/apt/lists/*
# Download and install Python 3.10 from source
RUN curl -sS https://www.python.org/ftp/python/3.10.14/Python-3.10.14.tgz -o /tmp/Python-3.10.14.tgz \
&& cd /tmp \
&& tar xzf Python-3.10.14.tgz \
&& cd Python-3.10.14 \
&& ./configure --enable-optimizations --prefix=/usr/local \
&& make -j$(nproc) \
&& make altinstall \
&& cd / \
&& rm -rf /tmp/Python-3.10.14* \
&& ln -s /usr/local/bin/python3.10 /usr/local/bin/python3 \
&& ln -s /usr/local/bin/pip3.10 /usr/local/bin/pip3
# Install ROS TF packages
RUN apt-get update && apt-get install -y --no-install-recommends \
python3-tf2-ros \
ros-noetic-tf2-tools \
ros-noetic-tf2-geometry-msgs \
&& rm -rf /var/lib/apt/lists/*
# Create app directory
WORKDIR /app
# Install FastMCP and dependencies using Python 3.10
COPY requirements.txt /app/
RUN python3.10 -m pip install --no-cache-dir -r requirements.txt
# Copy application code
COPY src/ /app/src/
COPY pyproject.toml README.md /app/
# Install the package
RUN python3.10 -m pip install --no-cache-dir -e .
# Set environment variables
ENV ROS_MASTER_URI=http://localhost:11311
ENV ROS_IP=127.0.0.1
ENV PYTHONUNBUFFERED=1
ENV PYTHONPATH=/opt/ros/noetic/lib/python3/dist-packages:/app/src
# Default port for HTTP transport
EXPOSE 8000
# Source ROS setup and run the server with Python 3.10
ENTRYPOINT ["/bin/bash", "-c", "source /opt/ros/noetic/setup.bash && exec python3.10 -m ros_mcp_server \"$@\"", "--"]
CMD ["--transport", "http", "--port", "8000"]