diff --git a/backend/Dockerfile b/backend/Dockerfile index b25f466e..6d7200d6 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -1,28 +1,45 @@ -# syntax=docker/dockerfile:1.4 -# Multi-stage build for FastAPI backend with optimized caching +# Multi-stage build for FastAPI backend - Railway optimized +# Optimization: Split dependencies into stable base + app layers for better cache hits FROM python:3.11-slim as builder -# Set working directory WORKDIR /app -# Install system dependencies (cached layer) +# Install system dependencies (cached layer - rarely changes) RUN apt-get update && apt-get install -y --no-install-recommends \ build-essential \ git \ && rm -rf /var/lib/apt/lists/* -# Upgrade pip once (cached layer) +# Upgrade pip (cached layer) RUN pip install --no-cache-dir --upgrade pip -# Copy ONLY requirements first for better layer caching -# This layer only rebuilds when requirements.txt changes -COPY backend/requirements.txt . +# OPTIMIZATION: Install heavy/stable dependencies first (better layer caching) +# These packages rarely change and take longest to install +RUN pip install --no-cache-dir --prefer-binary \ + torch --index-url https://download.pytorch.org/whl/cpu || true -# Install Python dependencies with BuildKit cache mount -# This caches downloaded packages between builds, dramatically speeding up rebuilds -RUN --mount=type=cache,id=pip-cache,target=/root/.cache/pip \ - pip install --prefer-binary -r requirements.txt +# Install ML/NLP packages that are large but stable +RUN pip install --no-cache-dir --prefer-binary \ + sentence-transformers \ + chromadb \ + langchain-openai \ + langchain-experimental \ + langchain_anthropic \ + langchain-google-genai \ + langgraph + +# Install data processing packages +RUN pip install --no-cache-dir --prefer-binary \ + polars \ + pyarrow \ + pandas \ + numpy \ + matplotlib + +# Copy and install remaining requirements +COPY backend/requirements.txt . +RUN pip install --no-cache-dir --prefer-binary -r requirements.txt # Production stage FROM python:3.11-slim @@ -33,7 +50,7 @@ WORKDIR /app COPY --from=builder /usr/local/lib/python3.11/site-packages /usr/local/lib/python3.11/site-packages COPY --from=builder /usr/local/bin /usr/local/bin -# Copy application code from backend directory (including __main__.py for python -m) +# Copy application code from backend directory COPY backend ./backend # Copy tradingagents package from project root @@ -49,5 +66,5 @@ RUN mkdir -p /app/results EXPOSE 8000 # Run the application using the PORT environment variable (required by Railway) -# Using --reload false to prevent hot-reload issues in production CMD ["sh", "-c", "python -m backend --reload false --port ${PORT:-8000}"] +