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"]