sterepando commited on
Commit
53962df
·
verified ·
1 Parent(s): f179f42

Update Dockerfile

Browse files
Files changed (1) hide show
  1. Dockerfile +28 -48
Dockerfile CHANGED
@@ -1,6 +1,6 @@
1
  FROM ubuntu:22.04
2
 
3
- # 1. [...](asc_slot://start-slot-5)Установка системных зависимостей
4
  ENV DEBIAN_FRONTEND=noninteractive
5
  RUN apt-get update && apt-get install -y \
6
  wget \
@@ -15,7 +15,7 @@ RUN apt-get update && apt-get install -y \
15
  python3-dev \
16
  && rm -rf /var/lib/apt/lists/*
17
 
18
- # 2. Настройка переменных окружения для Android NDK и Python
19
  ENV ANDROID_NDK_VERSION=r25c
20
  ENV ANDROID_API=30
21
  ENV ANDROID_ARCH=arm64
@@ -24,85 +24,65 @@ ENV PY_VERSION=3.11.9
24
  ENV NDK_ROOT=/opt/android-ndk
25
  ENV PATH=$NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64/bin:$PATH
26
 
27
- # 3. [...](asc_slot://start-slot-7)Скачивание и распаковка Android NDK
28
  WORKDIR /opt
29
  RUN wget -q https://dl.google.com/android/repository/android-ndk-${ANDROID_NDK_VERSION}-linux.zip && \
30
  unzip -q android-ndk-${ANDROID_NDK_VERSION}-linux.zip && \
31
  mv android-ndk-${ANDROID_NDK_VERSION} android-ndk && \
32
  rm android-ndk-${ANDROID_NDK_VERSION}-linux.zip
33
 
34
- # 4. Скачивание исходников Python 3.11 (нужны для заголовков pyconfig.h под Android)
35
  WORKDIR /opt/python-src
36
  RUN wget -q https://www.python.org/ftp/python/${PY_VERSION}/Python-${PY_VERSION}.tgz && \
37
  tar -xzf Python-${PY_VERSION}.tgz && \
38
  mv Python-${PY_VERSION} python3-android
39
 
40
- # 5. [...](asc_slot://start-slot-9)Настройка компиляторов для Cross-Compilation
41
- # [...](asc_slot://start-slot-11)Мы создаем скрипт-обертку, чтобы "обмануть" configure питона и сгенерировать правильный pyconfig.h
42
  WORKDIR /opt/python-src/python3-android
43
-
44
- # Переменные для компиляции под Android API 30
45
- ENV CC="aarch64-linux-android${ANDROID_API}-clang"
46
- ENV CXX="aarch64-linux-android${ANDROID_API}-clang++"
47
- ENV AR="llvm-ar"
48
- ENV LD="ld.lld"
49
- ENV READELF="llvm-readelf"
50
- ENV RANLIB="llvm-ranlib"
51
- ENV STRIP="llvm-strip"
52
-
53
- # [...](asc_slot://start-slot-13)Флаги компиляции
54
- ENV CFLAGS="-Os -fPIC -DANDROID -Wno-unused-result -Wno-unused-value -Wno-strict-aliasing"
55
- ENV LDFLAGS="-L$NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/${ANDROID_API}"
56
-
57
- # Конфигурируем Python (только чтобы создать Makefile и pyconfig.h)
58
- # --build=x86_64-linux-gnu (где собираем)
59
- # --host=aarch64-linux-android (для кого собираем)
60
- # --disable-ipv6 (часто ломает сборку на андроиде без патчей)
61
  RUN ./configure \
62
  --host=aarch64-linux-android \
63
  --build=x86_64-linux-gnu \
64
  --enable-shared \
65
  --disable-ipv6 \
66
  ac_cv_file__dev_ptmx=no \
67
- ac_cv_file__dev_ptc=no
 
 
68
 
69
- # Нам не нужно компилировать весь Python, достаточно заголовков.
70
- # Но pycryptodome нужен 'pyconfig.h', который создается после configure.
71
-
72
- # 6. Сборка PyCryptodome
73
  WORKDIR /build
74
  RUN pip3 install build wheel
75
 
76
- # [...](asc_slot://start-slot-15)Создаем скрипт сборки
77
  RUN echo '#!/bin/bash' > build_wheel.sh && \
78
  echo 'export CC="aarch64-linux-android'${ANDROID_API}'-clang"' >> build_wheel.sh && \
79
  echo 'export LDSHARED="aarch64-linux-android'${ANDROID_API}'-clang -shared"' >> build_wheel.sh && \
80
  echo 'export CFLAGS="-I/opt/python-src/python3-android -I/opt/python-src/python3-android/Include -DANDROID"' >> build_wheel.sh && \
81
- # [...](asc_slot://start-slot-17)PyCryptodome специфичные флаги, чтобы он не пытался искать libgmp и использовал встроенные реализации
82
  echo 'export LDFLAGS="-L/opt/python-src/python3-android"' >> build_wheel.sh && \
83
- # [...](asc_slot://start-slot-19)Принудительно задаем платформу для имени файла
84
- echo 'pip3 wheel pycryptodome --no-binary :all: --no-deps -w dist/ --build-option "--plat-name=android_21-30_arm64_v8a"' >> build_wheel.sh
85
 
86
  RUN chmod +x build_wheel.sh
87
 
88
  # Запускаем сборку
89
  RUN ./build_wheel.sh
90
 
91
- # 7. Финальная стадия: переименование (если pip не справился с точным форматом) и подготовка выдачи
92
- # Pip может добавить лишние теги, поэтому мы жестко переименуем под ваш запрос.RUN cd dist && \
93
- FIND_NAME=$(ls pycryptodome-*.whl | head -n 1) && \
94
- # [...](asc_slot://start-slot-23)Разбираем имя: pycryptodome-3.19.0-cp311-cp311-linux_x86_64.whl -> pycryptodome-X.Y.Z-cp311-cp311-android_21-30_arm64_v8a.whl
95
- # Но вы просили конкретный суффикс.
96
- [...](asc_slot://start-slot-25)NEW_NAME=$(echo $FIND_NAME | sed -E 's/linux_x86_64|any|android_.*\.whl/android_21-30_arm64_v8a.whl/') && \
97
- # [...](asc_slot://start-slot-27)Если sed не сработал идеально, форсируем:
98
- VERSION=$(pip3 show pycryptodome | grep Version | awk '{print $2}') && \
99
- FINAL_NAME="pycryptodome-${VERSION}-cp311-cp311-android_21-30_arm64_v8a.whl" && \
100
- mv "$FIND_NAME" "/output/$FINAL_NAME" || mv "$FIND_NAME" "/output/pycryptodome-custom-android.whl"
 
 
 
101
 
102
- # Создаем папку output для монтирования или скачивания
103
  WORKDIR /output
104
- # Копируем результат туда (на случай если предыдущий шаг был внутри слоя)
105
- RUN cp /build/dist/*.whl . || true
106
 
107
- # Чтобы контейнер не падал сразу, а дал забрать файл
108
- CMD ["tail", "-f", "/dev/null"]
 
 
1
  FROM ubuntu:22.04
2
 
3
+ # 1. Установка системных зависимостей
4
  ENV DEBIAN_FRONTEND=noninteractive
5
  RUN apt-get update && apt-get install -y \
6
  wget \
 
15
  python3-dev \
16
  && rm -rf /var/lib/apt/lists/*
17
 
18
+ # 2. Настройка переменных окружения (Android NDK r25c + API 30)
19
  ENV ANDROID_NDK_VERSION=r25c
20
  ENV ANDROID_API=30
21
  ENV ANDROID_ARCH=arm64
 
24
  ENV NDK_ROOT=/opt/android-ndk
25
  ENV PATH=$NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64/bin:$PATH
26
 
27
+ # 3. Скачивание Android NDK
28
  WORKDIR /opt
29
  RUN wget -q https://dl.google.com/android/repository/android-ndk-${ANDROID_NDK_VERSION}-linux.zip && \
30
  unzip -q android-ndk-${ANDROID_NDK_VERSION}-linux.zip && \
31
  mv android-ndk-${ANDROID_NDK_VERSION} android-ndk && \
32
  rm android-ndk-${ANDROID_NDK_VERSION}-linux.zip
33
 
34
+ # 4. Скачивание исходников Python 3.11 (для заголовков)
35
  WORKDIR /opt/python-src
36
  RUN wget -q https://www.python.org/ftp/python/${PY_VERSION}/Python-${PY_VERSION}.tgz && \
37
  tar -xzf Python-${PY_VERSION}.tgz && \
38
  mv Python-${PY_VERSION} python3-android
39
 
40
+ # 5. Конфигурация Python для получения pyconfig.h под Android
 
41
  WORKDIR /opt/python-src/python3-android
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
42
  RUN ./configure \
43
  --host=aarch64-linux-android \
44
  --build=x86_64-linux-gnu \
45
  --enable-shared \
46
  --disable-ipv6 \
47
  ac_cv_file__dev_ptmx=no \
48
+ ac_cv_file__dev_ptc=no \
49
+ CC="aarch64-linux-android${ANDROID_API}-clang" \
50
+ CXX="aarch64-linux-android${ANDROID_API}-clang++"
51
 
52
+ # 6. Подготовка скрипта сборки
 
 
 
53
  WORKDIR /build
54
  RUN pip3 install build wheel
55
 
56
+ # Создаем скрипт build_wheel.sh без лишних комментариев, чтобы не ломать слои
57
  RUN echo '#!/bin/bash' > build_wheel.sh && \
58
  echo 'export CC="aarch64-linux-android'${ANDROID_API}'-clang"' >> build_wheel.sh && \
59
  echo 'export LDSHARED="aarch64-linux-android'${ANDROID_API}'-clang -shared"' >> build_wheel.sh && \
60
  echo 'export CFLAGS="-I/opt/python-src/python3-android -I/opt/python-src/python3-android/Include -DANDROID"' >> build_wheel.sh && \
 
61
  echo 'export LDFLAGS="-L/opt/python-src/python3-android"' >> build_wheel.sh && \
62
+ echo 'mkdir -p dist' >> build_wheel.sh && \
63
+ echo 'pip3 wheel pycryptodome --no-binary :all: --no-deps -w dist/' >> build_wheel.sh
64
 
65
  RUN chmod +x build_wheel.sh
66
 
67
  # Запускаем сборку
68
  RUN ./build_wheel.sh
69
 
70
+ # 7. Переименование и подготовка к выдаче
71
+ # Создаем папку output и перемещаем туда файл с правильным именем
72
+ RUN mkdir -p /output && \
73
+ cd dist && \
74
+ ORIGINAL_WHEEL=$(ls pycryptodome-*.whl | head -n 1) && \
75
+ # Извлекаем версию из имени файла (например, pycryptodome-3.19.0-...)
76
+ VERSION=$(echo $ORIGINAL_WHEEL | grep -oP 'pycryptodome-\K[0-9.]+') && \
77
+ # Формируем нужное имя
78
+ NEW_NAME="pycryptodome-${VERSION}-cp311-cp311-android_21-30_arm64_v8a.whl" && \
79
+ mv "$ORIGINAL_WHEEL" "/output/$NEW_NAME"
80
+
81
+ # Настройка прав доступа для пользователя (Hugging Face запускает не под root, нужно дать права на чтение)
82
+ RUN chmod -R 777 /output
83
 
 
84
  WORKDIR /output
 
 
85
 
86
+ # 8. Запуск HTTP сервера
87
+ # Порт 7860 - стандартный порт для HF Spaces
88
+ CMD ["python3", "-m", "http.server", "7860", "--directory", "/output"]