File size: 2,449 Bytes
1b27b35
 
9a4e9d5
 
 
1ab4a0c
9a4e9d5
 
4204d37
 
 
 
1ab4a0c
1b27b35
9a4e9d5
 
 
1ab4a0c
9a4e9d5
1b27b35
 
9a4e9d5
 
 
 
 
 
 
 
 
1b27b35
9a4e9d5
 
 
 
 
1b27b35
1ab4a0c
9a4e9d5
 
 
 
 
 
1b27b35
9a4e9d5
 
 
 
4204d37
 
 
 
 
 
 
 
9a4e9d5
 
 
4204d37
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
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"]