sterepando commited on
Commit
f6aef8e
·
verified ·
1 Parent(s): 48c286a

Update Dockerfile

Browse files
Files changed (1) hide show
  1. Dockerfile +33 -9
Dockerfile CHANGED
@@ -1,5 +1,7 @@
 
1
  FROM python:3.11-bookworm
2
 
 
3
  RUN apt-get update && apt-get install -y \
4
  wget unzip git build-essential pkg-config \
5
  libffi-dev libssl-dev zlib1g-dev ncurses-dev \
@@ -10,6 +12,7 @@ RUN apt-get update && apt-get install -y \
10
  patchelf zip \
11
  && rm -rf /var/lib/apt/lists/*
12
 
 
13
  ENV WORK_DIR=/build
14
  ENV OUTPUT_DIR=/app/wheels
15
  ENV NDK_VERSION=r26b
@@ -23,9 +26,15 @@ 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
  RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --default-toolchain stable
27
  RUN rustup target add aarch64-linux-android
28
 
 
29
  RUN pip install --upgrade pip && \
30
  pip install --no-cache-dir \
31
  Cython wheel setuptools poetry-core hatchling \
@@ -34,11 +43,13 @@ RUN pip install --upgrade pip && \
34
 
35
  WORKDIR ${WORK_DIR}
36
 
 
37
  RUN wget -q https://dl.google.com/android/repository/android-ndk-${NDK_VERSION}-linux.zip && \
38
  unzip -q android-ndk-${NDK_VERSION}-linux.zip && \
39
  mv android-ndk-${NDK_VERSION} ${NDK_HOME} && \
40
  rm android-ndk-${NDK_VERSION}-linux.zip
41
 
 
42
  ENV TOOLCHAIN=${NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64
43
  ENV PATH=${TOOLCHAIN}/bin:$PATH
44
  ENV TARGET=${ANDROID_ARCH}-linux-android${ANDROID_API}
@@ -55,6 +66,7 @@ ENV CFLAGS="-target ${TARGET} -fPIC -D__ANDROID__"
55
  ENV CXXFLAGS="-target ${TARGET} -fPIC -D__ANDROID__"
56
  ENV LDFLAGS="-target ${TARGET} -fPIC"
57
 
 
58
  WORKDIR ${WORK_DIR}
59
  RUN wget -q https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz && \
60
  tar -xf openssl-${OPENSSL_VERSION}.tar.gz
@@ -74,12 +86,14 @@ ENV OPENSSL_LIB_DIR=${OPENSSL_DIR}/lib64
74
  ENV OPENSSL_INCLUDE_DIR=${OPENSSL_DIR}/include
75
  ENV OPENSSL_STATIC=1
76
 
 
77
  WORKDIR ${WORK_DIR}
78
  RUN wget -q https://www.python.org/ftp/python/${PYTHON_VERSION}/Python-${PYTHON_VERSION}.tgz && \
79
  tar -xf Python-${PYTHON_VERSION}.tgz
80
 
81
  WORKDIR ${WORK_DIR}/Python-${PYTHON_VERSION}
82
 
 
83
  RUN echo "ac_cv_file__dev_ptmx=yes" > config.site && \
84
  echo "ac_cv_file__dev_ptc=no" >> config.site && \
85
  echo "ac_cv_func_wcsftime=no" >> config.site && \
@@ -107,21 +121,24 @@ RUN CONFIG_SITE=config.site ./configure \
107
  RUN make -j$(nproc) libpython3.11.so || true
108
  RUN make install -i
109
 
 
110
  RUN mkdir -p ${WORK_DIR}/python-install/lib/python3.11
111
-
112
  RUN find ${WORK_DIR}/Python-${PYTHON_VERSION} -name "_sysconfigdata*.py" -not -name "*x86_64*" \
113
  -exec cp {} ${WORK_DIR}/python-install/lib/python3.11/_sysconfigdata__linux_aarch64-linux-android.py \;
114
-
115
  RUN cp ${WORK_DIR}/python-install/lib/python3.11/_sysconfigdata__linux_aarch64-linux-android.py \
116
  /usr/local/lib/python3.11/_sysconfigdata__linux_aarch64-linux-android.py
117
 
 
118
  WORKDIR ${OUTPUT_DIR}
119
 
120
- ENV TARGET_PACKAGE="heroku-tl-new==1.7.2"
 
121
 
 
122
  ENV CARGO_TARGET_AARCH64_LINUX_ANDROID_LINKER="${CC}"
123
  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}"
124
 
 
125
  RUN echo "#!/bin/bash" > build.sh && \
126
  echo "set -e" >> build.sh && \
127
  echo "export PYTHON_ANDROID_HOME=${WORK_DIR}/python-install" >> build.sh && \
@@ -130,42 +147,44 @@ RUN echo "#!/bin/bash" > build.sh && \
130
  echo "export LDSHARED=\"${CC} -shared\"" >> build.sh && \
131
  echo "export _PYTHON_SYSCONFIGDATA_NAME=_sysconfigdata__linux_aarch64-linux-android" >> build.sh && \
132
  echo "export _PYTHON_HOST_PLATFORM=linux-aarch64" >> build.sh && \
 
133
  echo "export PYO3_CROSS_LIB_DIR=${WORK_DIR}/python-install/lib" >> build.sh && \
134
  echo "export PYO3_CROSS_INCLUDE_DIR=${WORK_DIR}/python-install/include/python3.11" >> build.sh && \
135
  echo "export PYO3_CROSS_PYTHON_VERSION=3.11" >> build.sh && \
136
  echo "export CARGO_BUILD_TARGET=aarch64-linux-android" >> build.sh && \
137
  echo "export PYO3_NO_PYTHON_VERSION_CHECK=1" >> build.sh && \
 
138
  echo "export AARCH64_LINUX_ANDROID_OPENSSL_DIR=${OPENSSL_DIR}" >> build.sh && \
139
  echo "export AARCH64_LINUX_ANDROID_OPENSSL_LIB_DIR=${OPENSSL_LIB_DIR}" >> build.sh && \
140
  echo "export AARCH64_LINUX_ANDROID_OPENSSL_INCLUDE_DIR=${OPENSSL_INCLUDE_DIR}" >> build.sh && \
141
  echo "export OPENSSL_STATIC=1" >> build.sh && \
142
  echo "" >> build.sh && \
143
  echo "echo 'Starting Build for ${TARGET_PACKAGE}...'" >> build.sh && \
 
144
  echo "pip wheel ${TARGET_PACKAGE} --wheel-dir=${OUTPUT_DIR} --no-binary=:all: --no-build-isolation -v" >> build.sh && \
145
  chmod +x build.sh
146
 
147
  RUN ./build.sh
148
 
 
149
  RUN echo "Patching wheels to fix libpython dependency name..." && \
150
  for whl in *.whl; do \
151
  echo "Processing $whl..."; \
152
  mkdir -p tmp_wheel; \
153
  unzip -q "$whl" -d tmp_wheel; \
154
- # Find all .so files
155
  find tmp_wheel -name "*.so" | while read so_file; do \
156
- # If it links against the wrong name, swap it
157
  if patchelf --print-needed "$so_file" | grep -q "libpython3.11.so.1.0"; then \
158
  echo " -> Patching $so_file (replacing needed lib)"; \
159
  patchelf --replace-needed "libpython3.11.so.1.0" "libpython3.11.so" "$so_file"; \
160
  fi; \
161
  done; \
162
- # Repack
163
  cd tmp_wheel; \
164
  zip -r -q "../$whl" .; \
165
  cd ..; \
166
  rm -rf tmp_wheel; \
167
  done
168
 
 
169
  RUN for f in *.whl; do \
170
  if [ -f "$f" ]; then \
171
  new_name=$(echo "$f" | sed 's/linux_aarch64/android_24_arm64_v8a/g'); \
@@ -175,10 +194,15 @@ RUN for f in *.whl; do \
175
  fi \
176
  done
177
 
178
- RUN echo "<html><head><title>Heroku-TL Wheels</title></head><body>" > index.html && \
179
- echo "<h1>Wheels for heroku-tl-new (API 24, ARM64) [PATCHED NAME]</h1><ul>" >> index.html && \
 
180
  find . -name "*.whl" -printf "<li><a href=\"%P\">%P</a></li>\n" | sort >> index.html && \
181
  echo "</ul></body></html>" >> index.html
182
 
 
 
 
 
183
  EXPOSE 7860
184
- CMD ["python3", "-m", "http.server", "7860"]
 
1
+ # Используем тот же базовый образ, что и в примере
2
  FROM python:3.11-bookworm
3
 
4
+ # 1. Установка системных зависимостей
5
  RUN apt-get update && apt-get install -y \
6
  wget unzip git build-essential pkg-config \
7
  libffi-dev libssl-dev zlib1g-dev ncurses-dev \
 
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
 
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 \
 
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}
 
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
 
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 && \
 
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
  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'); \
 
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"]