FROM python:3.11-slim # Install system dependencies RUN apt-get update && apt-get install -y \ ffmpeg \ libsndfile1 \ libsndfile1-dev \ gcc \ g++ \ gfortran \ libopenblas-dev \ liblapack-dev \ pkg-config \ curl \ && rm -rf /var/lib/apt/lists/* # Set working directory WORKDIR /app # Upgrade pip, setuptools, wheel RUN pip install --no-cache-dir --upgrade pip setuptools wheel # Copy requirements COPY requirements.txt . # Install Python dependencies in stages for better caching RUN pip install --no-cache-dir numpy==1.24.3 RUN pip install --no-cache-dir scipy==1.11.4 # Install Essentia - detect architecture and install appropriate wheel RUN ARCH=$(uname -m) && \ if [ "$ARCH" = "x86_64" ]; then \ echo "Installing Essentia for x86_64..." && \ pip install --no-cache-dir --trusted-host essentia.upf.edu \ https://essentia.upf.edu/python-wheels/essentia-2.1_beta6.dev374-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl || \ echo "Essentia installation failed, using fallback mode"; \ elif [ "$ARCH" = "aarch64" ]; then \ echo "Installing Essentia for aarch64..." && \ pip install --no-cache-dir --trusted-host essentia.upf.edu \ https://essentia.upf.edu/python-wheels/essentia-2.1_beta6.dev374-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl || \ echo "Essentia installation failed, using fallback mode"; \ else \ echo "Unsupported architecture: $ARCH, using fallback mode"; \ fi RUN pip install --no-cache-dir -r requirements.txt # Copy application code COPY src/ ./src/ COPY alembic.ini . COPY models/ ./models/ # Create models directory if not exists RUN mkdir -p /app/models # Expose port EXPOSE 8000 # Run migrations and start server CMD alembic upgrade head && \ uvicorn src.api.main:app --host 0.0.0.0 --port 8000