sterepando commited on
Commit
acb2be3
·
verified ·
1 Parent(s): 131b4c9

Update Dockerfile

Browse files
Files changed (1) hide show
  1. Dockerfile +22 -12
Dockerfile CHANGED
@@ -1,6 +1,7 @@
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 \
@@ -10,9 +11,10 @@ RUN apt-get update && apt-get install -y \
10
  perl \
11
  patchelf zip \
12
  libsndfile1-dev \
 
13
  && rm -rf /var/lib/apt/lists/*
14
 
15
- # Настройка пользователя
16
  RUN useradd -m -u 1000 user
17
  ENV HOME=/home/user
18
  ENV WORK_DIR=/home/user/build
@@ -23,14 +25,14 @@ RUN mkdir -p ${WORK_DIR} ${OUTPUT_DIR} && chown -R user:user /home/user
23
  USER user
24
  WORKDIR ${WORK_DIR}
25
 
26
- # 2. Переменные окружения Android/Build
27
  ENV NDK_VERSION=r26b
28
  ENV ANDROID_API=24
29
  ENV ANDROID_ARCH=aarch64
30
  ENV ANDROID_HOME=${HOME}/android-sdk
31
  ENV NDK_HOME=${HOME}/android-ndk
32
- # !!! ВАЖНО: Дублируем переменную, так как OpenSSL и некоторые тулы ищут именно её
33
- ENV ANDROID_NDK_ROOT=${HOME}/android-ndk
34
  ENV PYTHON_VERSION=3.11.9
35
  ENV OPENSSL_VERSION=3.3.0
36
  ENV RUSTUP_HOME=${HOME}/.rustup
@@ -47,7 +49,6 @@ RUN wget -q https://dl.google.com/android/repository/android-ndk-${NDK_VERSION}-
47
  mv android-ndk-${NDK_VERSION} ${NDK_HOME} && \
48
  rm android-ndk-${NDK_VERSION}-linux.zip
49
 
50
- # Настройка путей тулчейна
51
  ENV TOOLCHAIN=${NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64
52
  ENV PATH=${TOOLCHAIN}/bin:$PATH
53
  ENV TARGET=${ANDROID_ARCH}-linux-android${ANDROID_API}
@@ -70,7 +71,7 @@ RUN wget -q https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz &&
70
  tar -xf openssl-${OPENSSL_VERSION}.tar.gz
71
 
72
  WORKDIR ${WORK_DIR}/openssl-${OPENSSL_VERSION}
73
- # Явно добавляем PATH к тулчейну в начало, чтобы perl-скрипт Configure нашел clang
74
  ENV PATH=${TOOLCHAIN}/bin:$PATH
75
  RUN ./Configure android-arm64 \
76
  -D__ANDROID_API__=${ANDROID_API} \
@@ -98,7 +99,6 @@ RUN echo "ac_cv_file__dev_ptmx=yes" > config.site && \
98
  echo "ac_cv_func_broken_mbstowcs=no" >> config.site && \
99
  echo "ac_cv_func_wcscoll=no" >> config.site
100
 
101
- # Конфигурируем и собираем минимальный набор для кросс-компиляции
102
  RUN CONFIG_SITE=config.site ./configure \
103
  CFLAGS="${CFLAGS}" \
104
  LDFLAGS="${LDFLAGS}" \
@@ -117,17 +117,19 @@ RUN CONFIG_SITE=config.site ./configure \
117
  make -j$(nproc) libpython3.11.so && \
118
  make install -i
119
 
 
120
  RUN mkdir -p ${WORK_DIR}/python-install/lib/python3.11
121
  RUN find ${WORK_DIR}/Python-${PYTHON_VERSION} -name "_sysconfigdata*.py" -not -name "*x86_64*" \
122
  -exec cp {} ${WORK_DIR}/python-install/lib/python3.11/_sysconfigdata__linux_aarch64-linux-android.py \;
123
 
124
- # Копируем конфиг, чтобы pip думал, что мы на aarch64
 
125
  USER root
126
  RUN cp ${WORK_DIR}/python-install/lib/python3.11/_sysconfigdata__linux_aarch64-linux-android.py \
127
- /usr/lib/python3.11/_sysconfigdata__linux_aarch64-linux-android.py
128
  USER user
129
 
130
- # 7. УСТАНОВКА ИНСТРУМЕНТОВ СБОРКИ (Build Backends)
131
  RUN pip install --upgrade pip && \
132
  pip install --user --no-cache-dir \
133
  Cython wheel setuptools \
@@ -137,11 +139,14 @@ RUN pip install --upgrade pip && \
137
  "flit-core" "hatchling" \
138
  "cffi" "pyyaml"
139
 
140
- # 8. Настройка переменных для кросс-компиляции
141
  ENV PKG_CONFIG_PATH=""
142
  ENV PYTHON_ANDROID_HOME=${WORK_DIR}/python-install
143
  ENV _PYTHON_SYSCONFIGDATA_NAME=_sysconfigdata__linux_aarch64-linux-android
144
  ENV _PYTHON_HOST_PLATFORM=linux-aarch64
 
 
 
145
  # Флаги для Rust/Maturin
146
  ENV PYO3_CROSS_LIB_DIR=${PYTHON_ANDROID_HOME}/lib
147
  ENV PYO3_CROSS_INCLUDE_DIR=${PYTHON_ANDROID_HOME}/include/python3.11
@@ -149,6 +154,7 @@ ENV PYO3_CROSS_PYTHON_VERSION=3.11
149
  ENV CARGO_BUILD_TARGET=aarch64-linux-android
150
  ENV CARGO_TARGET_AARCH64_LINUX_ANDROID_LINKER="${CC}"
151
  ENV CARGO_TARGET_AARCH64_LINUX_ANDROID_RUSTFLAGS="-C link-arg=-L${PYTHON_ANDROID_HOME}/lib -C link-arg=-lpython3.11 -L${OPENSSL_LIB_DIR}"
 
152
  # Флаги для C/C++
153
  ENV CFLAGS="${CFLAGS} -I${PYTHON_ANDROID_HOME}/include/python3.11 -I${OPENSSL_INCLUDE_DIR}"
154
  ENV LDFLAGS="${LDFLAGS} -L${PYTHON_ANDROID_HOME}/lib -L${OPENSSL_LIB_DIR}"
@@ -159,6 +165,7 @@ WORKDIR ${OUTPUT_DIR}
159
  # 9. Скрипт сборки
160
  RUN echo "#!/bin/bash" > build.sh && \
161
  echo "set -e" >> build.sh && \
 
162
  echo "export CMAKE_ARGS=\"-DANDROID_ABI=arm64-v8a -DANDROID_PLATFORM=android-${ANDROID_API} -DCMAKE_TOOLCHAIN_FILE=${NDK_HOME}/build/cmake/android.toolchain.cmake -DGGML_OPENCL=OFF -DGGML_VULKAN=OFF\"" >> build.sh && \
163
  echo "" >> build.sh && \
164
  echo "build_pkg() {" >> build.sh && \
@@ -166,16 +173,18 @@ RUN echo "#!/bin/bash" > build.sh && \
166
  echo " echo \"--------------------------------------------------\"" >> build.sh && \
167
  echo " echo \"BUILDING: \$PKG\"" >> build.sh && \
168
  echo " echo \"--------------------------------------------------\"" >> build.sh && \
 
169
  echo " python3 -m pip wheel \"\$PKG\" --wheel-dir=${OUTPUT_DIR} --no-binary=:all: --no-build-isolation --no-deps -v || echo \"FAILED: \$PKG\"" >> build.sh && \
170
  echo "}" >> build.sh && \
171
  echo "" >> build.sh && \
172
- # Сборка пакетов (порядок важен)
173
  echo "build_pkg 'numpy<2.0'" >> build.sh && \
174
  echo "build_pkg 'flask'" >> build.sh && \
175
  echo "build_pkg 'flask_compress'" >> build.sh && \
176
  echo "build_pkg 'tokenizers'" >> build.sh && \
177
  echo "build_pkg 'transformers'" >> build.sh && \
178
  echo "build_pkg 'llama-cpp-python'" >> build.sh && \
 
179
  echo "build_pkg 'soundfile'" >> build.sh && \
180
  echo "echo 'Build complete.'" >> build.sh && \
181
  chmod +x build.sh
@@ -191,6 +200,7 @@ RUN echo "Patching wheels..." && \
191
  mkdir -p tmp_wheel; \
192
  unzip -q "$whl" -d tmp_wheel; \
193
  find tmp_wheel -name "*.so" | while read so_file; do \
 
194
  if patchelf --print-needed "$so_file" | grep -q "libpython3.11.so.1.0"; then \
195
  echo "Patching $so_file"; \
196
  patchelf --replace-needed "libpython3.11.so.1.0" "libpython3.11.so" "$so_file"; \
 
1
  FROM python:3.11-bookworm
2
 
3
  # 1. Установка системных зависимостей
4
+ # Добавляем ninja-build и другие инструменты
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 \
 
11
  perl \
12
  patchelf zip \
13
  libsndfile1-dev \
14
+ ninja-build \
15
  && rm -rf /var/lib/apt/lists/*
16
 
17
+ # Создаем пользователя
18
  RUN useradd -m -u 1000 user
19
  ENV HOME=/home/user
20
  ENV WORK_DIR=/home/user/build
 
25
  USER user
26
  WORKDIR ${WORK_DIR}
27
 
28
+ # 2. Переменные окружения
29
  ENV NDK_VERSION=r26b
30
  ENV ANDROID_API=24
31
  ENV ANDROID_ARCH=aarch64
32
  ENV ANDROID_HOME=${HOME}/android-sdk
33
  ENV NDK_HOME=${HOME}/android-ndk
34
+ # Дублируем для совместимости разных систем сборки
35
+ ENV ANDROID_NDK_ROOT=${HOME}/android-ndk
36
  ENV PYTHON_VERSION=3.11.9
37
  ENV OPENSSL_VERSION=3.3.0
38
  ENV RUSTUP_HOME=${HOME}/.rustup
 
49
  mv android-ndk-${NDK_VERSION} ${NDK_HOME} && \
50
  rm android-ndk-${NDK_VERSION}-linux.zip
51
 
 
52
  ENV TOOLCHAIN=${NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64
53
  ENV PATH=${TOOLCHAIN}/bin:$PATH
54
  ENV TARGET=${ANDROID_ARCH}-linux-android${ANDROID_API}
 
71
  tar -xf openssl-${OPENSSL_VERSION}.tar.gz
72
 
73
  WORKDIR ${WORK_DIR}/openssl-${OPENSSL_VERSION}
74
+ # Добавляем путь к NDK в начало PATH для Configure
75
  ENV PATH=${TOOLCHAIN}/bin:$PATH
76
  RUN ./Configure android-arm64 \
77
  -D__ANDROID_API__=${ANDROID_API} \
 
99
  echo "ac_cv_func_broken_mbstowcs=no" >> config.site && \
100
  echo "ac_cv_func_wcscoll=no" >> config.site
101
 
 
102
  RUN CONFIG_SITE=config.site ./configure \
103
  CFLAGS="${CFLAGS}" \
104
  LDFLAGS="${LDFLAGS}" \
 
117
  make -j$(nproc) libpython3.11.so && \
118
  make install -i
119
 
120
+ # Подготавливаем файл sysconfig
121
  RUN mkdir -p ${WORK_DIR}/python-install/lib/python3.11
122
  RUN find ${WORK_DIR}/Python-${PYTHON_VERSION} -name "_sysconfigdata*.py" -not -name "*x86_64*" \
123
  -exec cp {} ${WORK_DIR}/python-install/lib/python3.11/_sysconfigdata__linux_aarch64-linux-android.py \;
124
 
125
+ # !!! ИСПРАВЛЕНИЕ !!!
126
+ # Копируем конфиг в правильное место (/usr/local/lib, а не /usr/lib)
127
  USER root
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
  USER user
131
 
132
+ # 7. УСТАНОВКА ИНСТРУМЕНТОВ СБОРКИ
133
  RUN pip install --upgrade pip && \
134
  pip install --user --no-cache-dir \
135
  Cython wheel setuptools \
 
139
  "flit-core" "hatchling" \
140
  "cffi" "pyyaml"
141
 
142
+ # 8. Настройка переменных окружения для кросс-компиляции
143
  ENV PKG_CONFIG_PATH=""
144
  ENV PYTHON_ANDROID_HOME=${WORK_DIR}/python-install
145
  ENV _PYTHON_SYSCONFIGDATA_NAME=_sysconfigdata__linux_aarch64-linux-android
146
  ENV _PYTHON_HOST_PLATFORM=linux-aarch64
147
+ # Добавляем путь к sysconfig в PYTHONPATH для гарантии
148
+ ENV PYTHONPATH=/usr/local/lib/python3.11
149
+
150
  # Флаги для Rust/Maturin
151
  ENV PYO3_CROSS_LIB_DIR=${PYTHON_ANDROID_HOME}/lib
152
  ENV PYO3_CROSS_INCLUDE_DIR=${PYTHON_ANDROID_HOME}/include/python3.11
 
154
  ENV CARGO_BUILD_TARGET=aarch64-linux-android
155
  ENV CARGO_TARGET_AARCH64_LINUX_ANDROID_LINKER="${CC}"
156
  ENV CARGO_TARGET_AARCH64_LINUX_ANDROID_RUSTFLAGS="-C link-arg=-L${PYTHON_ANDROID_HOME}/lib -C link-arg=-lpython3.11 -L${OPENSSL_LIB_DIR}"
157
+
158
  # Флаги для C/C++
159
  ENV CFLAGS="${CFLAGS} -I${PYTHON_ANDROID_HOME}/include/python3.11 -I${OPENSSL_INCLUDE_DIR}"
160
  ENV LDFLAGS="${LDFLAGS} -L${PYTHON_ANDROID_HOME}/lib -L${OPENSSL_LIB_DIR}"
 
165
  # 9. Скрипт сборки
166
  RUN echo "#!/bin/bash" > build.sh && \
167
  echo "set -e" >> build.sh && \
168
+ # Специфичные настройки для Llama.cpp
169
  echo "export CMAKE_ARGS=\"-DANDROID_ABI=arm64-v8a -DANDROID_PLATFORM=android-${ANDROID_API} -DCMAKE_TOOLCHAIN_FILE=${NDK_HOME}/build/cmake/android.toolchain.cmake -DGGML_OPENCL=OFF -DGGML_VULKAN=OFF\"" >> build.sh && \
170
  echo "" >> build.sh && \
171
  echo "build_pkg() {" >> build.sh && \
 
173
  echo " echo \"--------------------------------------------------\"" >> build.sh && \
174
  echo " echo \"BUILDING: \$PKG\"" >> build.sh && \
175
  echo " echo \"--------------------------------------------------\"" >> build.sh && \
176
+ # Используем --no-deps, чтобы pip не пытался установить зависимости в хост-систему
177
  echo " python3 -m pip wheel \"\$PKG\" --wheel-dir=${OUTPUT_DIR} --no-binary=:all: --no-build-isolation --no-deps -v || echo \"FAILED: \$PKG\"" >> build.sh && \
178
  echo "}" >> build.sh && \
179
  echo "" >> build.sh && \
180
+ # Порядок сборки
181
  echo "build_pkg 'numpy<2.0'" >> build.sh && \
182
  echo "build_pkg 'flask'" >> build.sh && \
183
  echo "build_pkg 'flask_compress'" >> build.sh && \
184
  echo "build_pkg 'tokenizers'" >> build.sh && \
185
  echo "build_pkg 'transformers'" >> build.sh && \
186
  echo "build_pkg 'llama-cpp-python'" >> build.sh && \
187
+ # soundfile часто проблемный из-за libsndfile, пробуем
188
  echo "build_pkg 'soundfile'" >> build.sh && \
189
  echo "echo 'Build complete.'" >> build.sh && \
190
  chmod +x build.sh
 
200
  mkdir -p tmp_wheel; \
201
  unzip -q "$whl" -d tmp_wheel; \
202
  find tmp_wheel -name "*.so" | while read so_file; do \
203
+ # Если библиотека ссылается на libpython3.11.so.1.0, меняем на libpython3.11.so
204
  if patchelf --print-needed "$so_file" | grep -q "libpython3.11.so.1.0"; then \
205
  echo "Patching $so_file"; \
206
  patchelf --replace-needed "libpython3.11.so.1.0" "libpython3.11.so" "$so_file"; \