Spaces:
Running
Running
| FROM python:3.11-slim | |
| ENV DEBIAN_FRONTEND=noninteractive \ | |
| ANDROID_SDK_ROOT=/opt/android-sdk \ | |
| ANDROID_HOME=/opt/android-sdk \ | |
| JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 \ | |
| GRADLE_USER_HOME=/tmp/.gradle \ | |
| HF_HOME=/tmp/hf_cache \ | |
| HF_HUB_CACHE=/tmp/hf_cache \ | |
| PORT=7860 \ | |
| GRADIO_SERVER_NAME=0.0.0.0 \ | |
| GRADIO_SERVER_PORT=7860 \ | |
| PATH=/opt/android-sdk/cmdline-tools/latest/bin:/opt/android-sdk/platform-tools:/usr/lib/jvm/java-21-openjdk-amd64/bin:/opt/gradle-8.7/bin:$PATH | |
| # Base tooling | |
| RUN apt-get update && apt-get install -y --no-install-recommends \ | |
| git curl wget unzip zip ca-certificates \ | |
| openjdk-21-jdk-headless \ | |
| build-essential cmake \ | |
| && rm -rf /var/lib/apt/lists/* | |
| # Android cmdline tools + SDK | |
| RUN mkdir -p $ANDROID_SDK_ROOT/cmdline-tools && \ | |
| cd /tmp && \ | |
| wget -q https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip -O cmdtools.zip && \ | |
| unzip -q cmdtools.zip && \ | |
| mv cmdline-tools $ANDROID_SDK_ROOT/cmdline-tools/latest && \ | |
| rm cmdtools.zip && \ | |
| yes | sdkmanager --licenses >/dev/null 2>&1 || true && \ | |
| sdkmanager --install "platform-tools" "platforms;android-34" "build-tools;34.0.0" >/dev/null | |
| # Gradle | |
| RUN wget -q https://services.gradle.org/distributions/gradle-8.7-bin.zip -O /tmp/gradle.zip && \ | |
| unzip -q /tmp/gradle.zip -d /opt && \ | |
| ln -s /opt/gradle-8.7/bin/gradle /usr/local/bin/gradle && \ | |
| rm /tmp/gradle.zip | |
| # HF Spaces runs as user 1000 | |
| RUN useradd -m -u 1000 user && \ | |
| mkdir -p /app /workspace /tmp/.gradle /tmp/hf_cache && \ | |
| chown -R user:user /app /workspace /tmp/.gradle /tmp/hf_cache $ANDROID_SDK_ROOT | |
| USER user | |
| WORKDIR /app | |
| COPY --chown=user:user requirements.txt . | |
| RUN pip install --no-cache-dir --upgrade pip && \ | |
| pip install --no-cache-dir -r requirements.txt | |
| # Pre-download the GGUF model at build time so the first user request does not | |
| # have to wait for (and risk timing out on) a ~1GB download at runtime. This is | |
| # the main reason the Space booted into RUNTIME_ERROR before the UI loaded. | |
| RUN python -c "from huggingface_hub import hf_hub_download; \ | |
| hf_hub_download(repo_id='Qwen/Qwen2.5-Coder-1.5B-Instruct-GGUF', \ | |
| filename='qwen2.5-coder-1.5b-instruct-q4_k_m.gguf')" || \ | |
| echo 'model pre-download skipped (will download at runtime)' | |
| COPY --chown=user:user . . | |
| EXPOSE 7860 | |
| # Use exec form so signals propagate; app.py reads $PORT. | |
| CMD ["python", "app.py"] | |