Spaces:
Paused
Paused
Update Dockerfile
Browse files- Dockerfile +24 -22
Dockerfile
CHANGED
|
@@ -1,7 +1,7 @@
|
|
| 1 |
-
#
|
| 2 |
FROM python:3.11-slim
|
| 3 |
|
| 4 |
-
# Установка
|
| 5 |
RUN apt-get update && apt-get install -y \
|
| 6 |
wget \
|
| 7 |
unzip \
|
|
@@ -9,10 +9,9 @@ RUN apt-get update && apt-get install -y \
|
|
| 9 |
build-essential \
|
| 10 |
&& rm -rf /var/lib/apt/lists/*
|
| 11 |
|
| 12 |
-
# Рабочая директория
|
| 13 |
WORKDIR /build
|
| 14 |
|
| 15 |
-
# 1. Скачивание
|
| 16 |
ENV NDK_VERSION=r26b
|
| 17 |
RUN wget -q https://dl.google.com/android/repository/android-ndk-${NDK_VERSION}-linux.zip && \
|
| 18 |
unzip -q android-ndk-${NDK_VERSION}-linux.zip && \
|
|
@@ -28,32 +27,36 @@ ENV LD="$TOOLCHAIN/bin/ld"
|
|
| 28 |
ENV AR="$TOOLCHAIN/bin/llvm-ar"
|
| 29 |
ENV STRIP="$TOOLCHAIN/bin/llvm-strip"
|
| 30 |
|
| 31 |
-
#
|
| 32 |
-
|
| 33 |
-
ENV CFLAGS="-fPIC -O3 -Wall -target ${TARGET}${API_LEVEL}"
|
| 34 |
ENV LDFLAGS="-shared -L. -Wl,-soname,MandreLib.so"
|
| 35 |
|
| 36 |
# 2. Установка Cython
|
| 37 |
RUN pip install cython
|
| 38 |
|
| 39 |
-
# 3. Скачивание
|
| 40 |
-
# Мы скачиваем сырой файл
|
| 41 |
RUN wget -O MandreLib.py https://github.com/coidarashka/MandreLib/raw/refs/heads/main/MandreLib.py
|
| 42 |
|
| 43 |
-
#
|
| 44 |
-
#
|
| 45 |
-
#
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 46 |
|
| 47 |
-
#
|
|
|
|
|
|
|
| 48 |
RUN cython -3 MandreLib.py -o MandreLib.c
|
| 49 |
|
| 50 |
-
#
|
| 51 |
-
# Используем те, что есть в контейнере, так как версия совпадает (3.11)
|
| 52 |
ENV PYTHON_INCLUDE=/usr/local/include/python3.11
|
| 53 |
|
| 54 |
-
#
|
| 55 |
-
#
|
| 56 |
-
# Флаг -undefined dynamic_lookup (или эквивалент для ELF) позволяет оставить символы Python неразрешенными до загрузки
|
| 57 |
RUN $CC $CFLAGS \
|
| 58 |
-I$PYTHON_INCLUDE \
|
| 59 |
-o MandreLib.so \
|
|
@@ -61,13 +64,12 @@ RUN $CC $CFLAGS \
|
|
| 61 |
$LDFLAGS \
|
| 62 |
-Wl,--allow-shlib-undefined
|
| 63 |
|
| 64 |
-
#
|
| 65 |
RUN $STRIP --strip-unneeded MandreLib.so
|
| 66 |
|
| 67 |
-
#
|
| 68 |
-
# Создаем простой HTTP сервер, чтобы можно было скачать файл, если запустить Space
|
| 69 |
RUN mkdir /output && mv MandreLib.so /output/MandreLib.so
|
| 70 |
WORKDIR /output
|
| 71 |
|
| 72 |
-
#
|
| 73 |
CMD ["python3", "-m", "http.server", "7860"]
|
|
|
|
| 1 |
+
# Используем Python 3.11 (как в Chaquopy 16.1)
|
| 2 |
FROM python:3.11-slim
|
| 3 |
|
| 4 |
+
# Установка инструментов
|
| 5 |
RUN apt-get update && apt-get install -y \
|
| 6 |
wget \
|
| 7 |
unzip \
|
|
|
|
| 9 |
build-essential \
|
| 10 |
&& rm -rf /var/lib/apt/lists/*
|
| 11 |
|
|
|
|
| 12 |
WORKDIR /build
|
| 13 |
|
| 14 |
+
# 1. Скачивание NDK r26b
|
| 15 |
ENV NDK_VERSION=r26b
|
| 16 |
RUN wget -q https://dl.google.com/android/repository/android-ndk-${NDK_VERSION}-linux.zip && \
|
| 17 |
unzip -q android-ndk-${NDK_VERSION}-linux.zip && \
|
|
|
|
| 27 |
ENV AR="$TOOLCHAIN/bin/llvm-ar"
|
| 28 |
ENV STRIP="$TOOLCHAIN/bin/llvm-strip"
|
| 29 |
|
| 30 |
+
# Флаги: -fPIC обязательно для .so, отключаем строгие проверки
|
| 31 |
+
ENV CFLAGS="-fPIC -O3 -Wall -target ${TARGET}${API_LEVEL} -Wno-unused-command-line-argument"
|
|
|
|
| 32 |
ENV LDFLAGS="-shared -L. -Wl,-soname,MandreLib.so"
|
| 33 |
|
| 34 |
# 2. Установка Cython
|
| 35 |
RUN pip install cython
|
| 36 |
|
| 37 |
+
# 3. Скачивание библиотеки
|
|
|
|
| 38 |
RUN wget -O MandreLib.py https://github.com/coidarashka/MandreLib/raw/refs/heads/main/MandreLib.py
|
| 39 |
|
| 40 |
+
# ==========================================
|
| 41 |
+
# 4. ПАТЧИНГ ДЛЯ CYTHON (FIX ОШИБОК)
|
| 42 |
+
# ==========================================
|
| 43 |
+
# Мы добавляем заглушки для 'java' и 'OutOfMemoryError', чтобы Cython не ругался при компиляции.
|
| 44 |
+
# При запуске на Android try/except блоки позволят работать реальным модулям.
|
| 45 |
+
RUN echo "Creating compile-time mocks..." && \
|
| 46 |
+
printf "try:\n import java\nexcept ImportError:\n # Mock for compilation\n class _JavaMock:\n def __getattr__(self, name):\n return _JavaMock()\n def __call__(self, *args, **kwargs):\n return _JavaMock()\n @property\n def lang(self): return _JavaMock()\n java = _JavaMock()\n\ntry:\n OutOfMemoryError\nexcept NameError:\n class OutOfMemoryError(MemoryError): pass\n\n" > header_patch.py && \
|
| 47 |
+
cat header_patch.py MandreLib.py > MandreLib_patched.py && \
|
| 48 |
+
mv MandreLib_patched.py MandreLib.py
|
| 49 |
|
| 50 |
+
# 5. Транспиляция Python -> C
|
| 51 |
+
# -3: Python 3 syntax
|
| 52 |
+
# --embed: НЕ используем, так как нам нужна библиотека, а не исполняемый файл
|
| 53 |
RUN cython -3 MandreLib.py -o MandreLib.c
|
| 54 |
|
| 55 |
+
# 6. Получение путей к заголовкам Python
|
|
|
|
| 56 |
ENV PYTHON_INCLUDE=/usr/local/include/python3.11
|
| 57 |
|
| 58 |
+
# 7. Компиляция C -> SO
|
| 59 |
+
# -Wl,--allow-shlib-undefined: Разрешаем нелинокованные символы (Python API будет предоставлен хост-приложением ExteraGram)
|
|
|
|
| 60 |
RUN $CC $CFLAGS \
|
| 61 |
-I$PYTHON_INCLUDE \
|
| 62 |
-o MandreLib.so \
|
|
|
|
| 64 |
$LDFLAGS \
|
| 65 |
-Wl,--allow-shlib-undefined
|
| 66 |
|
| 67 |
+
# 8. Стриппинг (уменьшение размера)
|
| 68 |
RUN $STRIP --strip-unneeded MandreLib.so
|
| 69 |
|
| 70 |
+
# 9. Финал: подготовка к скачиванию
|
|
|
|
| 71 |
RUN mkdir /output && mv MandreLib.so /output/MandreLib.so
|
| 72 |
WORKDIR /output
|
| 73 |
|
| 74 |
+
# Запускаем сервер, чтобы можно было скачать файл из Space
|
| 75 |
CMD ["python3", "-m", "http.server", "7860"]
|