sterepando commited on
Commit
e5c0e9b
·
verified ·
1 Parent(s): 872b425

Update Dockerfile

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