File size: 4,617 Bytes
71b4454
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
dad8bfa
71b4454
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
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"]