sterepando commited on
Commit
81fadce
·
verified ·
1 Parent(s): f6aef8e

Update Dockerfile

Browse files
Files changed (1) hide show
  1. Dockerfile +30 -66
Dockerfile CHANGED
@@ -1,4 +1,3 @@
1
- # Используем тот же базовый образ, что и в примере
2
  FROM python:3.11-bookworm
3
 
4
  # 1. Установка системных зависимостей
@@ -12,44 +11,42 @@ RUN apt-get update && apt-get install -y \
12
  patchelf zip \
13
  && rm -rf /var/lib/apt/lists/*
14
 
15
- # 2. Настройка переменных окружения для кросс-компиляции
16
  ENV WORK_DIR=/build
17
  ENV OUTPUT_DIR=/app/wheels
18
  ENV NDK_VERSION=r26b
19
  ENV ANDROID_API=24
20
  ENV ANDROID_ARCH=aarch64
21
- ENV ANDROID_HOME=/opt/android-sdk
22
  ENV NDK_HOME=/opt/android-ndk
23
- ENV ANDROID_NDK_ROOT=/opt/android-ndk
24
  ENV PYTHON_VERSION=3.11.9
25
  ENV OPENSSL_VERSION=3.3.0
26
  ENV RUSTUP_HOME=/opt/rust
27
  ENV CARGO_HOME=/opt/rust
28
  ENV PATH=$PATH:/opt/rust/bin
29
 
30
- # Создаем рабочие директории
31
  RUN mkdir -p ${WORK_DIR} ${OUTPUT_DIR}
32
 
33
- # 3. Установка Rust (нужен для sqlmodel -> pydantic-core)
34
  RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --default-toolchain stable
35
  RUN rustup target add aarch64-linux-android
36
 
37
- # 4. Обновление pip и установка инструментов сборки
38
  RUN pip install --upgrade pip && \
39
  pip install --no-cache-dir \
40
- Cython wheel setuptools poetry-core hatchling \
41
- hatch-fancy-pypi-readme hatch-vcs flit-core \
 
42
  expandvars maturin typing-extensions
43
 
44
  WORKDIR ${WORK_DIR}
45
 
46
- # 5. Скачивание и установка Android NDK
47
  RUN wget -q https://dl.google.com/android/repository/android-ndk-${NDK_VERSION}-linux.zip && \
48
  unzip -q android-ndk-${NDK_VERSION}-linux.zip && \
49
  mv android-ndk-${NDK_VERSION} ${NDK_HOME} && \
50
  rm android-ndk-${NDK_VERSION}-linux.zip
51
 
52
- # Настройка тулчейна NDK
53
  ENV TOOLCHAIN=${NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64
54
  ENV PATH=${TOOLCHAIN}/bin:$PATH
55
  ENV TARGET=${ANDROID_ARCH}-linux-android${ANDROID_API}
@@ -58,7 +55,6 @@ ENV CXX="${TOOLCHAIN}/bin/${TARGET}-clang++"
58
  ENV AR="${TOOLCHAIN}/bin/llvm-ar"
59
  ENV NM="${TOOLCHAIN}/bin/llvm-nm"
60
  ENV LD="${TOOLCHAIN}/bin/ld"
61
- ENV RANLIB="${TOOLCHAIN}/bin/llvm-ranlib"
62
  ENV STRIP="${TOOLCHAIN}/bin/llvm-strip"
63
  ENV READELF="${TOOLCHAIN}/bin/llvm-readelf"
64
 
@@ -66,34 +62,30 @@ ENV CFLAGS="-target ${TARGET} -fPIC -D__ANDROID__"
66
  ENV CXXFLAGS="-target ${TARGET} -fPIC -D__ANDROID__"
67
  ENV LDFLAGS="-target ${TARGET} -fPIC"
68
 
69
- # 6. Сборка OpenSSL для Android (нужен для aiohttp/cryptography)
70
  WORKDIR ${WORK_DIR}
71
  RUN wget -q https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz && \
72
  tar -xf openssl-${OPENSSL_VERSION}.tar.gz
73
 
74
  WORKDIR ${WORK_DIR}/openssl-${OPENSSL_VERSION}
75
-
76
  RUN ./Configure android-arm64 \
77
  -D__ANDROID_API__=${ANDROID_API} \
78
  --prefix=${WORK_DIR}/openssl-install \
79
  --openssldir=${WORK_DIR}/openssl-install \
80
- no-shared no-tests
81
-
82
- RUN make -j$(nproc) && make install_sw
83
 
84
  ENV OPENSSL_DIR=${WORK_DIR}/openssl-install
85
  ENV OPENSSL_LIB_DIR=${OPENSSL_DIR}/lib64
86
  ENV OPENSSL_INCLUDE_DIR=${OPENSSL_DIR}/include
87
  ENV OPENSSL_STATIC=1
88
 
89
- # 7. Сборка Python для Android (чтобы получить libpython3.11.so)
90
  WORKDIR ${WORK_DIR}
91
  RUN wget -q https://www.python.org/ftp/python/${PYTHON_VERSION}/Python-${PYTHON_VERSION}.tgz && \
92
  tar -xf Python-${PYTHON_VERSION}.tgz
93
 
94
  WORKDIR ${WORK_DIR}/Python-${PYTHON_VERSION}
95
-
96
- # Отключаем функции, которых нет в Android libc
97
  RUN echo "ac_cv_file__dev_ptmx=yes" > config.site && \
98
  echo "ac_cv_file__dev_ptc=no" >> config.site && \
99
  echo "ac_cv_func_wcsftime=no" >> config.site && \
@@ -103,42 +95,29 @@ RUN echo "ac_cv_file__dev_ptmx=yes" > config.site && \
103
  echo "ac_cv_func_wcscoll=no" >> config.site
104
 
105
  RUN CONFIG_SITE=config.site ./configure \
106
- CFLAGS="${CFLAGS}" \
107
- LDFLAGS="${LDFLAGS}" \
108
- --host=aarch64-linux-android \
109
- --build=x86_64-linux-gnu \
110
  --prefix=${WORK_DIR}/python-install \
111
- --disable-ipv6 \
112
- --enable-shared \
113
- --without-ensurepip \
114
  --with-build-python=/usr/local/bin/python3 \
115
- --disable-test-modules \
116
- --without-doc-strings \
117
- --with-system-ffi=no \
118
- --without-decimal \
119
- --without-ctypes
120
-
121
- RUN make -j$(nproc) libpython3.11.so || true
122
- RUN make install -i
123
 
124
- # Копируем конфиги sysconfig, чтобы pip понимал, что мы на Android
125
  RUN mkdir -p ${WORK_DIR}/python-install/lib/python3.11
126
  RUN find ${WORK_DIR}/Python-${PYTHON_VERSION} -name "_sysconfigdata*.py" -not -name "*x86_64*" \
127
  -exec cp {} ${WORK_DIR}/python-install/lib/python3.11/_sysconfigdata__linux_aarch64-linux-android.py \;
128
  RUN cp ${WORK_DIR}/python-install/lib/python3.11/_sysconfigdata__linux_aarch64-linux-android.py \
129
  /usr/local/lib/python3.11/_sysconfigdata__linux_aarch64-linux-android.py
130
 
131
- # 8. Сборка maxapi-python и зависимостей
132
  WORKDIR ${OUTPUT_DIR}
133
-
134
- # Целевой пакет
135
  ENV TARGET_PACKAGE="maxapi-python"
136
-
137
- # Настройка линкера для Rust (для pydantic-core/sqlmodel)
138
  ENV CARGO_TARGET_AARCH64_LINUX_ANDROID_LINKER="${CC}"
139
  ENV CARGO_TARGET_AARCH64_LINUX_ANDROID_RUSTFLAGS="-C link-arg=-L${WORK_DIR}/python-install/lib -C link-arg=-lpython3.11 -L ${OPENSSL_LIB_DIR}"
140
 
141
- # Скрипт сборки
142
  RUN echo "#!/bin/bash" > build.sh && \
143
  echo "set -e" >> build.sh && \
144
  echo "export PYTHON_ANDROID_HOME=${WORK_DIR}/python-install" >> build.sh && \
@@ -147,62 +126,47 @@ RUN echo "#!/bin/bash" > build.sh && \
147
  echo "export LDSHARED=\"${CC} -shared\"" >> build.sh && \
148
  echo "export _PYTHON_SYSCONFIGDATA_NAME=_sysconfigdata__linux_aarch64-linux-android" >> build.sh && \
149
  echo "export _PYTHON_HOST_PLATFORM=linux-aarch64" >> build.sh && \
150
- # PyO3 (Rust bindings) configuration
151
  echo "export PYO3_CROSS_LIB_DIR=${WORK_DIR}/python-install/lib" >> build.sh && \
152
  echo "export PYO3_CROSS_INCLUDE_DIR=${WORK_DIR}/python-install/include/python3.11" >> build.sh && \
153
  echo "export PYO3_CROSS_PYTHON_VERSION=3.11" >> build.sh && \
154
  echo "export CARGO_BUILD_TARGET=aarch64-linux-android" >> build.sh && \
155
  echo "export PYO3_NO_PYTHON_VERSION_CHECK=1" >> build.sh && \
156
- # OpenSSL bindings configuration
157
  echo "export AARCH64_LINUX_ANDROID_OPENSSL_DIR=${OPENSSL_DIR}" >> build.sh && \
158
  echo "export AARCH64_LINUX_ANDROID_OPENSSL_LIB_DIR=${OPENSSL_LIB_DIR}" >> build.sh && \
159
  echo "export AARCH64_LINUX_ANDROID_OPENSSL_INCLUDE_DIR=${OPENSSL_INCLUDE_DIR}" >> build.sh && \
160
  echo "export OPENSSL_STATIC=1" >> build.sh && \
161
  echo "" >> build.sh && \
162
- echo "echo 'Starting Build for ${TARGET_PACKAGE}...'" >> build.sh && \
163
- # Команда сборки колес
164
  echo "pip wheel ${TARGET_PACKAGE} --wheel-dir=${OUTPUT_DIR} --no-binary=:all: --no-build-isolation -v" >> build.sh && \
165
  chmod +x build.sh
166
 
167
  RUN ./build.sh
168
 
169
- # 9. Патчинг колес (исправление ссылок на библиотеки)
170
- RUN echo "Patching wheels to fix libpython dependency name..." && \
171
  for whl in *.whl; do \
172
- echo "Processing $whl..."; \
173
- mkdir -p tmp_wheel; \
174
- unzip -q "$whl" -d tmp_wheel; \
175
  find tmp_wheel -name "*.so" | while read so_file; do \
176
  if patchelf --print-needed "$so_file" | grep -q "libpython3.11.so.1.0"; then \
177
- echo " -> Patching $so_file (replacing needed lib)"; \
178
  patchelf --replace-needed "libpython3.11.so.1.0" "libpython3.11.so" "$so_file"; \
179
  fi; \
180
  done; \
181
- cd tmp_wheel; \
182
- zip -r -q "../$whl" .; \
183
- cd ..; \
184
- rm -rf tmp_wheel; \
185
  done
186
 
187
- # 10. Переименование для совместимости с Android установщиками
188
  RUN for f in *.whl; do \
189
  if [ -f "$f" ]; then \
190
  new_name=$(echo "$f" | sed 's/linux_aarch64/android_24_arm64_v8a/g'); \
191
- if [ "$f" != "$new_name" ]; then \
192
- mv "$f" "$new_name"; \
193
- fi \
194
  fi \
195
  done
196
 
197
- # 11. Создание HTML индекса
198
- RUN echo "<html><head><title>MandreLib Wheels</title></head><body>" > index.html && \
199
- echo "<h1>Wheels for maxapi-python (API 24, ARM64)</h1><ul>" >> index.html && \
200
  find . -name "*.whl" -printf "<li><a href=\"%P\">%P</a></li>\n" | sort >> index.html && \
201
  echo "</ul></body></html>" >> index.html
202
 
203
- # Настройка прав для пользователя Hugging Face (user 1000)
204
  RUN chmod -R 777 ${OUTPUT_DIR}
205
-
206
- # Открытие порта 7860 и запуск сервера
207
  EXPOSE 7860
208
  CMD ["python3", "-m", "http.server", "7860"]
 
 
1
  FROM python:3.11-bookworm
2
 
3
  # 1. Установка системных зависимостей
 
11
  patchelf zip \
12
  && rm -rf /var/lib/apt/lists/*
13
 
14
+ # 2. Настройка переменных окружения
15
  ENV WORK_DIR=/build
16
  ENV OUTPUT_DIR=/app/wheels
17
  ENV NDK_VERSION=r26b
18
  ENV ANDROID_API=24
19
  ENV ANDROID_ARCH=aarch64
 
20
  ENV NDK_HOME=/opt/android-ndk
 
21
  ENV PYTHON_VERSION=3.11.9
22
  ENV OPENSSL_VERSION=3.3.0
23
  ENV RUSTUP_HOME=/opt/rust
24
  ENV CARGO_HOME=/opt/rust
25
  ENV PATH=$PATH:/opt/rust/bin
26
 
 
27
  RUN mkdir -p ${WORK_DIR} ${OUTPUT_DIR}
28
 
29
+ # 3. Установка Rust (для pydantic-core/maturin)
30
  RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --default-toolchain stable
31
  RUN rustup target add aarch64-linux-android
32
 
33
+ # 4. Установка инструментов сборки (ДОБАВЛЕН pdm-backend)
34
  RUN pip install --upgrade pip && \
35
  pip install --no-cache-dir \
36
+ Cython wheel setuptools setuptools-scm \
37
+ poetry-core hatchling hatch-fancy-pypi-readme hatch-vcs \
38
+ flit-core pdm-backend \
39
  expandvars maturin typing-extensions
40
 
41
  WORKDIR ${WORK_DIR}
42
 
43
+ # 5. Установка Android NDK
44
  RUN wget -q https://dl.google.com/android/repository/android-ndk-${NDK_VERSION}-linux.zip && \
45
  unzip -q android-ndk-${NDK_VERSION}-linux.zip && \
46
  mv android-ndk-${NDK_VERSION} ${NDK_HOME} && \
47
  rm android-ndk-${NDK_VERSION}-linux.zip
48
 
49
+ # Настройка тулчейна
50
  ENV TOOLCHAIN=${NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64
51
  ENV PATH=${TOOLCHAIN}/bin:$PATH
52
  ENV TARGET=${ANDROID_ARCH}-linux-android${ANDROID_API}
 
55
  ENV AR="${TOOLCHAIN}/bin/llvm-ar"
56
  ENV NM="${TOOLCHAIN}/bin/llvm-nm"
57
  ENV LD="${TOOLCHAIN}/bin/ld"
 
58
  ENV STRIP="${TOOLCHAIN}/bin/llvm-strip"
59
  ENV READELF="${TOOLCHAIN}/bin/llvm-readelf"
60
 
 
62
  ENV CXXFLAGS="-target ${TARGET} -fPIC -D__ANDROID__"
63
  ENV LDFLAGS="-target ${TARGET} -fPIC"
64
 
65
+ # 6. Сборка OpenSSL
66
  WORKDIR ${WORK_DIR}
67
  RUN wget -q https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz && \
68
  tar -xf openssl-${OPENSSL_VERSION}.tar.gz
69
 
70
  WORKDIR ${WORK_DIR}/openssl-${OPENSSL_VERSION}
 
71
  RUN ./Configure android-arm64 \
72
  -D__ANDROID_API__=${ANDROID_API} \
73
  --prefix=${WORK_DIR}/openssl-install \
74
  --openssldir=${WORK_DIR}/openssl-install \
75
+ no-shared no-tests && \
76
+ make -j$(nproc) && make install_sw
 
77
 
78
  ENV OPENSSL_DIR=${WORK_DIR}/openssl-install
79
  ENV OPENSSL_LIB_DIR=${OPENSSL_DIR}/lib64
80
  ENV OPENSSL_INCLUDE_DIR=${OPENSSL_DIR}/include
81
  ENV OPENSSL_STATIC=1
82
 
83
+ # 7. Сборка Python (для libpython3.11.so)
84
  WORKDIR ${WORK_DIR}
85
  RUN wget -q https://www.python.org/ftp/python/${PYTHON_VERSION}/Python-${PYTHON_VERSION}.tgz && \
86
  tar -xf Python-${PYTHON_VERSION}.tgz
87
 
88
  WORKDIR ${WORK_DIR}/Python-${PYTHON_VERSION}
 
 
89
  RUN echo "ac_cv_file__dev_ptmx=yes" > config.site && \
90
  echo "ac_cv_file__dev_ptc=no" >> config.site && \
91
  echo "ac_cv_func_wcsftime=no" >> config.site && \
 
95
  echo "ac_cv_func_wcscoll=no" >> config.site
96
 
97
  RUN CONFIG_SITE=config.site ./configure \
98
+ CFLAGS="${CFLAGS}" LDFLAGS="${LDFLAGS}" \
99
+ --host=aarch64-linux-android --build=x86_64-linux-gnu \
 
 
100
  --prefix=${WORK_DIR}/python-install \
101
+ --disable-ipv6 --enable-shared --without-ensurepip \
 
 
102
  --with-build-python=/usr/local/bin/python3 \
103
+ --disable-test-modules --without-doc-strings \
104
+ --with-system-ffi=no --without-decimal --without-ctypes && \
105
+ make -j$(nproc) libpython3.11.so || true && \
106
+ make install -i
 
 
 
 
107
 
108
+ # Исправление sysconfig
109
  RUN mkdir -p ${WORK_DIR}/python-install/lib/python3.11
110
  RUN find ${WORK_DIR}/Python-${PYTHON_VERSION} -name "_sysconfigdata*.py" -not -name "*x86_64*" \
111
  -exec cp {} ${WORK_DIR}/python-install/lib/python3.11/_sysconfigdata__linux_aarch64-linux-android.py \;
112
  RUN cp ${WORK_DIR}/python-install/lib/python3.11/_sysconfigdata__linux_aarch64-linux-android.py \
113
  /usr/local/lib/python3.11/_sysconfigdata__linux_aarch64-linux-android.py
114
 
115
+ # 8. Сборка maxapi-python
116
  WORKDIR ${OUTPUT_DIR}
 
 
117
  ENV TARGET_PACKAGE="maxapi-python"
 
 
118
  ENV CARGO_TARGET_AARCH64_LINUX_ANDROID_LINKER="${CC}"
119
  ENV CARGO_TARGET_AARCH64_LINUX_ANDROID_RUSTFLAGS="-C link-arg=-L${WORK_DIR}/python-install/lib -C link-arg=-lpython3.11 -L ${OPENSSL_LIB_DIR}"
120
 
 
121
  RUN echo "#!/bin/bash" > build.sh && \
122
  echo "set -e" >> build.sh && \
123
  echo "export PYTHON_ANDROID_HOME=${WORK_DIR}/python-install" >> build.sh && \
 
126
  echo "export LDSHARED=\"${CC} -shared\"" >> build.sh && \
127
  echo "export _PYTHON_SYSCONFIGDATA_NAME=_sysconfigdata__linux_aarch64-linux-android" >> build.sh && \
128
  echo "export _PYTHON_HOST_PLATFORM=linux-aarch64" >> build.sh && \
 
129
  echo "export PYO3_CROSS_LIB_DIR=${WORK_DIR}/python-install/lib" >> build.sh && \
130
  echo "export PYO3_CROSS_INCLUDE_DIR=${WORK_DIR}/python-install/include/python3.11" >> build.sh && \
131
  echo "export PYO3_CROSS_PYTHON_VERSION=3.11" >> build.sh && \
132
  echo "export CARGO_BUILD_TARGET=aarch64-linux-android" >> build.sh && \
133
  echo "export PYO3_NO_PYTHON_VERSION_CHECK=1" >> build.sh && \
 
134
  echo "export AARCH64_LINUX_ANDROID_OPENSSL_DIR=${OPENSSL_DIR}" >> build.sh && \
135
  echo "export AARCH64_LINUX_ANDROID_OPENSSL_LIB_DIR=${OPENSSL_LIB_DIR}" >> build.sh && \
136
  echo "export AARCH64_LINUX_ANDROID_OPENSSL_INCLUDE_DIR=${OPENSSL_INCLUDE_DIR}" >> build.sh && \
137
  echo "export OPENSSL_STATIC=1" >> build.sh && \
138
  echo "" >> build.sh && \
139
+ echo "echo 'Starting Build...'" >> build.sh && \
 
140
  echo "pip wheel ${TARGET_PACKAGE} --wheel-dir=${OUTPUT_DIR} --no-binary=:all: --no-build-isolation -v" >> build.sh && \
141
  chmod +x build.sh
142
 
143
  RUN ./build.sh
144
 
145
+ # 9. Патчинг колес
146
+ RUN echo "Patching wheels..." && \
147
  for whl in *.whl; do \
148
+ mkdir -p tmp_wheel; unzip -q "$whl" -d tmp_wheel; \
 
 
149
  find tmp_wheel -name "*.so" | while read so_file; do \
150
  if patchelf --print-needed "$so_file" | grep -q "libpython3.11.so.1.0"; then \
 
151
  patchelf --replace-needed "libpython3.11.so.1.0" "libpython3.11.so" "$so_file"; \
152
  fi; \
153
  done; \
154
+ cd tmp_wheel; zip -r -q "../$whl" .; cd ..; rm -rf tmp_wheel; \
 
 
 
155
  done
156
 
157
+ # 10. Переименование
158
  RUN for f in *.whl; do \
159
  if [ -f "$f" ]; then \
160
  new_name=$(echo "$f" | sed 's/linux_aarch64/android_24_arm64_v8a/g'); \
161
+ if [ "$f" != "$new_name" ]; then mv "$f" "$new_name"; fi \
 
 
162
  fi \
163
  done
164
 
165
+ # 11. Индекс
166
+ RUN echo "<html><body><h1>Wheels</h1><ul>" > index.html && \
 
167
  find . -name "*.whl" -printf "<li><a href=\"%P\">%P</a></li>\n" | sort >> index.html && \
168
  echo "</ul></body></html>" >> index.html
169
 
 
170
  RUN chmod -R 777 ${OUTPUT_DIR}
 
 
171
  EXPOSE 7860
172
  CMD ["python3", "-m", "http.server", "7860"]