# ========================================== # STAGE 1: Vývojové prostředí, kde vše zkompilujeme # ========================================== FROM ghcr.io/home-assistant/armv7-homeassistant-base:latest AS builder # 1. ČISTÉ MINIMUM: Pouze nástroje nezbytné pro kompilaci samotného Pythonu 3.14 # Tento krok se spustí JEDNOU a Docker si ho navždy nacachuje. RUN apk add --no-cache \ build-base ffi-dev openssl-dev bzip2-dev zlib-dev \ readline-dev sqlite-dev xz-dev wget musl-dev # 2. KOMPILACE PYTHONU 3.14 # Dokud nezměníte verzi Pythonu (3.14.9), tento krok se už NIKDY nebude opakovat! RUN wget https://python.org && \ tar -xf Python-3.14.9.tar.xz && \ cd Python-3.14.9 && \ ./configure --enable-optimizations --with-ensurepip=install && \ make -j$(nproc) && \ make altinstall && \ cd .. && rm -rf Python-3.14.9* # 3. Přesměrování příkazů a instalace UV do nového Pythonu RUN ln -sf /usr/local/bin/python3.14 /usr/local/bin/python3 && \ ln -sf /usr/local/bin/pip3.14 /usr/local/bin/pip3 && \ pip3 install --no-cache-dir uv # ========================================================================= # ZDE JE TA ZMĚNA: Sem můžete kdykoliv přidat autoconf, cmake nebo ccache # a Python se už ZNOVU KOMPILOVAT NEBUDE. # ====================================================================== # 3b. DODATEČNÉ KOMPILAČNÍ NÁSTROJE PRO PYTHON BALÍČKY (Např. NumPy, DTLSSocket, PyAV...) # Přidány ffmpeg-dev a pkgconfig pro úspěšný build balíčku 'av' RUN apk add --no-cache \ cmake rust cargo samurai ccache autoconf automake \ jpeg-dev openjpeg-dev tiff-dev freetype-dev lcms2-dev libwebp-dev \ ffmpeg-dev pkgconfig # 4. Zkopírování textových souborů závislostí WORKDIR /tmp COPY requirements.txt ./ COPY homeassistant/*.txt ./homeassistant/ # 3b. DODATEČNÉ KOMPILAČNÍ NÁSTROJE A SYSTÉMOVÉ PYAV # Přidán py3-av, který obsahuje nativně zkompilované PyAV pro vaši verzi FFmpeg RUN apk add --no-cache \ cmake rust cargo samurai ccache autoconf automake \ jpeg-dev openjpeg-dev tiff-dev freetype-dev lcms2-dev libwebp-dev \ ffmpeg-dev pkgconfig py3-av # 4. Zkopírování textových souborů závislostí WORKDIR /tmp COPY requirements.txt ./ COPY homeassistant/*.txt ./homeassistant/ # ========================================================================= # NOVÝ KROK: Odstranění av z requirements, aby se uv nepokoušel o jeho kompilaci # ========================================================================= RUN sed -i '/^av==/d' requirements.txt homeassistant/*.txt 2>/dev/null || true # 5. Spuštění kompilace do specifické složky RUN --mount=type=cache,target=/root/.cache/uv \ echo -e "[properties]\nlongdouble_format = 'IEEE_DOUBLE_LE'" > /tmp/meson-native.ini && \ uv pip install \ --config-settings=setup-args="--native-file=/tmp/meson-native.ini" \ --config-settings=compile-args="-j$(nproc)" \ --index-strategy unsafe-best-match \ --target /compiled-packages \ -r requirements.txt && \ rm /tmp/meson-native.ini # ... (zde ponechte vaše LABEL a ENV definice) ... ## Setup Home Assistant Core dependencies COPY --parents requirements.txt homeassistant/package_constraints.txt homeassistant/ RUN \ go2rtc --version \ && pip3 install --no-cache-dir "uv==$(awk -F'==' '/^uv==/{print $2}' homeassistant/requirements.txt)" \ && sed -i '/^av==/d' homeassistant/requirements.txt 2>/dev/null || true \ && UV_CONCURRENT_BUILDS=1 uv pip install \ --index-strategy unsafe-best-match \ -r homeassistant/requirements.txt COPY requirements_all.txt home_assistant_frontend-* home_assistant_intents-* homeassistant/ RUN \ if ls homeassistant/home_assistant_*.whl 1> /dev/null 2>&1; then \ uv pip install homeassistant/home_assistant_*.whl; \ fi \ && sed -i '/^av==/d' homeassistant/requirements_all.txt 2>/dev/null || true \ && UV_CONCURRENT_BUILDS=1 uv pip install \ --index-strategy unsafe-best-match \ -r homeassistant/requirements_all.txt ## Setup Home Assistant Core COPY --parents LICENSE* README* homeassistant/ pyproject.toml homeassistant/ # Na konec linkujeme systémové PyAV z Alpine do naší složky compiled-packages RUN \ uv pip install -e ./homeassistant \ && cp -r /usr/lib/python3.*/site-packages/av* /compiled-packages/ 2>/dev/null || true \ && python3 -m compileall homeassistant/homeassistant WORKDIR /config ## Setup Home Assistant Core dependencies COPY --parents requirements.txt homeassistant/package_constraints.txt homeassistant/ RUN \ go2rtc --version \ && pip3 install --no-cache-dir "uv==$(awk -F'==' '/^uv==/{print $2}' homeassistant/requirements.txt)" \ && export CFLAGS="-DAVERROR_HTTP_TOO_MANY_REQUESTS=-1112362804 -DAV_FRAME_DATA_LCEVC=2" \ && export UV_CONCURRENT_BUILDS=1 \ && uv pip install \ --index-strategy unsafe-best-match \ -r homeassistant/requirements.txt COPY requirements_all.txt home_assistant_frontend-* home_assistant_intents-* homeassistant/ RUN \ if ls homeassistant/home_assistant_*.whl 1> /dev/null 2>&1; then \ uv pip install homeassistant/home_assistant_*.whl; \ fi \ && export CFLAGS="-DAVERROR_HTTP_TOO_MANY_REQUESTS=-1112362804 -DAV_FRAME_DATA_LCEVC=2" \ && export UV_CONCURRENT_BUILDS=1 \ && uv pip install \ --index-strategy unsafe-best-match \ -r homeassistant/requirements_all.txt