# First stage: Build and install dependencies FROM python:3.10-slim-bookworm as builder # Set the working directory in the container WORKDIR /usr/src/app # Install build dependencies RUN apt-get update && \ apt-get install -y --no-install-recommends \ wget \ curl \ unzip # Install Python dependencies COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt && \ pip install --no-cache-dir spacy torch torchvision torchaudio onnxruntime uvicorn && \ python -m spacy download en_core_web_sm # Download and install ChromeDriver RUN CHROMEDRIVER_VERSION=$(curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE) && \ wget -N https://chromedriver.storage.googleapis.com/$CHROMEDRIVER_VERSION/chromedriver_linux64.zip -P /tmp && \ unzip /tmp/chromedriver_linux64.zip -d /tmp && \ mv /tmp/chromedriver /usr/local/bin/chromedriver && \ chmod +x /usr/local/bin/chromedriver && \ rm /tmp/chromedriver_linux64.zip # Second stage: Create final runtime image FROM python:3.10-slim-bookworm # Set the working directory in the container WORKDIR /usr/src/app # Install runtime dependencies RUN apt-get update && \ apt-get install -y --no-install-recommends \ wget \ git \ xvfb \ gnupg2 \ ca-certificates \ apt-transport-https \ software-properties-common && \ wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | apt-key add - && \ echo "deb http://dl.google.com/linux/chrome/deb/ stable main" > /etc/apt/sources.list.d/google-chrome.list && \ apt-get update && \ apt-get install -y --no-install-recommends google-chrome-stable && \ rm -rf /var/lib/apt/lists/* /etc/apt/sources.list.d/google-chrome.list # Copy Chromedriver from the builder stage COPY --from=builder /usr/local/bin/chromedriver /usr/local/bin/chromedriver # Copy installed Python packages from builder stage COPY --from=builder /usr/local/lib/python3.10/site-packages /usr/local/lib/python3.10/site-packages COPY --from=builder /usr/local/bin /usr/local/bin # Copy the rest of the application code COPY . . # Set environment to use Chrome and ChromeDriver properly ENV CHROME_BIN=/usr/bin/google-chrome \ CHROMEDRIVER=/usr/local/bin/chromedriver \ DISPLAY=:99 \ DBUS_SESSION_BUS_ADDRESS=/dev/null \ PYTHONUNBUFFERED=1 # Ensure the PATH environment variable includes the location of the installed packages ENV PATH /usr/local/bin:$PATH # Make port 80 available to the world outside this container EXPOSE 80 # Run uvicorn CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "80", "--workers", "4"]