Spaces:
Sleeping
Sleeping
| FROM python:3.11-slim-bookworm | |
| ENV PYTHONDONTWRITEBYTECODE=1 \ | |
| PYTHONUNBUFFERED=1 \ | |
| PIP_NO_CACHE_DIR=1 \ | |
| ANDROID_HOME=/opt/android-sdk \ | |
| ANDROID_SDK_ROOT=/opt/android-sdk \ | |
| ANDROID_BUILD_TOOLS_VERSION=36.0.0 \ | |
| ANDROID_PLATFORM_VERSION=36 \ | |
| PATH=/opt/android-sdk/cmdline-tools/latest/bin:/opt/android-sdk/platform-tools:/opt/android-sdk/build-tools/36.0.0:$PATH | |
| WORKDIR /app | |
| RUN apt-get update && \ | |
| apt-get install -y --no-install-recommends \ | |
| bash \ | |
| ca-certificates \ | |
| curl \ | |
| wget \ | |
| git \ | |
| unzip \ | |
| zip \ | |
| openjdk-17-jdk-headless \ | |
| build-essential \ | |
| libstdc++6 \ | |
| libc6 \ | |
| zlib1g && \ | |
| rm -rf /var/lib/apt/lists/* | |
| ############################################################################### | |
| # Android command-line tools | |
| # | |
| # Official Linux command-line tools release. | |
| # SHA-256 is verified before extraction. | |
| ############################################################################### | |
| ARG ANDROID_CMDLINE_TOOLS_URL="https://dl.google.com/android/repository/commandlinetools-linux-15859902_latest.zip" | |
| ARG ANDROID_CMDLINE_TOOLS_SHA256="4e4c464f145a7512b57d088ac6c278c03c9eea610886b35a5e0804e74eedf583" | |
| RUN set -eux; \ | |
| mkdir -p "${ANDROID_SDK_ROOT}/cmdline-tools"; \ | |
| cd /tmp; \ | |
| curl -fsSL --retry 5 --retry-delay 3 \ | |
| "${ANDROID_CMDLINE_TOOLS_URL}" \ | |
| -o commandlinetools.zip; \ | |
| echo "${ANDROID_CMDLINE_TOOLS_SHA256} commandlinetools.zip" | sha256sum -c -; \ | |
| unzip -q commandlinetools.zip -d "${ANDROID_SDK_ROOT}/cmdline-tools"; \ | |
| mv "${ANDROID_SDK_ROOT}/cmdline-tools/cmdline-tools" \ | |
| "${ANDROID_SDK_ROOT}/cmdline-tools/latest"; \ | |
| rm -f commandlinetools.zip | |
| ############################################################################### | |
| # Android SDK packages required by native_apk_builder | |
| ############################################################################### | |
| RUN yes | sdkmanager --sdk_root="${ANDROID_SDK_ROOT}" --licenses >/dev/null || true | |
| RUN sdkmanager --sdk_root="${ANDROID_SDK_ROOT}" \ | |
| "platform-tools" \ | |
| "platforms;android-${ANDROID_PLATFORM_VERSION}" \ | |
| "build-tools;${ANDROID_BUILD_TOOLS_VERSION}" | |
| ############################################################################### | |
| # Verify the complete native Android toolchain during image construction. | |
| ############################################################################### | |
| RUN set -eux; \ | |
| test -x "${ANDROID_SDK_ROOT}/build-tools/${ANDROID_BUILD_TOOLS_VERSION}/aapt2"; \ | |
| test -x "${ANDROID_SDK_ROOT}/build-tools/${ANDROID_BUILD_TOOLS_VERSION}/d8"; \ | |
| test -x "${ANDROID_SDK_ROOT}/build-tools/${ANDROID_BUILD_TOOLS_VERSION}/zipalign"; \ | |
| test -x "${ANDROID_SDK_ROOT}/build-tools/${ANDROID_BUILD_TOOLS_VERSION}/apksigner"; \ | |
| test -f "${ANDROID_SDK_ROOT}/platforms/android-${ANDROID_PLATFORM_VERSION}/android.jar"; \ | |
| java -version; \ | |
| "${ANDROID_SDK_ROOT}/build-tools/${ANDROID_BUILD_TOOLS_VERSION}/aapt2" version; \ | |
| "${ANDROID_SDK_ROOT}/build-tools/${ANDROID_BUILD_TOOLS_VERSION}/d8" --version; \ | |
| "${ANDROID_SDK_ROOT}/build-tools/${ANDROID_BUILD_TOOLS_VERSION}/zipalign" -v 4 /dev/null /dev/null 2>/dev/null || true; \ | |
| "${ANDROID_SDK_ROOT}/build-tools/${ANDROID_BUILD_TOOLS_VERSION}/apksigner" --version | |
| ############################################################################### | |
| # Python dependencies | |
| ############################################################################### | |
| COPY requirements.txt . | |
| RUN python -m pip install --upgrade pip && \ | |
| python -m pip install --no-cache-dir -r requirements.txt | |
| ############################################################################### | |
| # Application | |
| ############################################################################### | |
| COPY . . | |
| RUN python - <<'PY' | |
| import importlib | |
| for module in ( | |
| "fastapi", | |
| "uvicorn", | |
| "asyncpg", | |
| "edge_tts", | |
| ): | |
| importlib.import_module(module) | |
| import app | |
| assert app.app.__class__.__name__ == "FastAPI" | |
| print("[OK] Production application import passed") | |
| PY | |
| ############################################################################### | |
| # Runtime verification | |
| ############################################################################### | |
| RUN set -eux; \ | |
| command -v java; \ | |
| command -v aapt2; \ | |
| command -v d8; \ | |
| command -v zipalign; \ | |
| command -v apksigner; \ | |
| test -f "${ANDROID_SDK_ROOT}/platforms/android-${ANDROID_PLATFORM_VERSION}/android.jar" | |
| EXPOSE 7860 | |
| CMD ["python", "-m", "uvicorn", "app:app", "--host", "0.0.0.0", "--port", "7860"] | |