| # debian.sh --arch 'arm64' out/ 'trixie' '@1775433600' |
| ENV PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin |
| RUN /bin/sh -c set -eux; apt-get update; apt-get install -y --no-install-recommends ca-certificates netbase tzdata ; apt-get dist-clean # buildkit |
| ENV GPG_KEY=7169605F62C751356D054A26A821E680E5FA6305 |
| ENV PYTHON_VERSION=3.13.13 |
| ENV PYTHON_SHA256=2ab91ff401783ccca64f75d10c882e957bdfd60e2bf5a72f8421793729b78a71 |
| RUN /bin/sh -c set -eux; savedAptMark="$(apt-mark showmanual)"; apt-get update; apt-get install -y --no-install-recommends dpkg-dev gcc gnupg libbluetooth-dev libbz2-dev libc6-dev libdb-dev libffi-dev libgdbm-dev liblzma-dev libncursesw5-dev libreadline-dev libsqlite3-dev libssl-dev make tk-dev uuid-dev wget xz-utils zlib1g-dev ; wget -O python.tar.xz "https://www.python.org/ftp/python/${PYTHON_VERSION%%[a-z]*}/Python-$PYTHON_VERSION.tar.xz"; echo "$PYTHON_SHA256 *python.tar.xz" | sha256sum -c -; wget -O python.tar.xz.asc "https://www.python.org/ftp/python/${PYTHON_VERSION%%[a-z]*}/Python-$PYTHON_VERSION.tar.xz.asc"; GNUPGHOME="$(mktemp -d)"; export GNUPGHOME; gpg --batch --keyserver hkps://keys.openpgp.org --recv-keys "$GPG_KEY"; gpg --batch --verify python.tar.xz.asc python.tar.xz; gpgconf --kill all; rm -rf "$GNUPGHOME" python.tar.xz.asc; mkdir -p /usr/src/python; tar --extract --directory /usr/src/python --strip-components=1 --file python.tar.xz; rm python.tar.xz; cd /usr/src/python; gnuArch="$(dpkg-architecture --query DEB_BUILD_GNU_TYPE)"; ./configure --build="$gnuArch" --enable-loadable-sqlite-extensions --enable-optimizations --enable-option-checking=fatal --enable-shared $(test "${gnuArch%%-*}" != 'riscv64' && echo '--with-lto') --with-ensurepip ; nproc="$(nproc)"; EXTRA_CFLAGS="$(dpkg-buildflags --get CFLAGS)"; LDFLAGS="$(dpkg-buildflags --get LDFLAGS)"; LDFLAGS="${LDFLAGS:-} -Wl,--strip-all"; arch="$(dpkg --print-architecture)"; arch="${arch##*-}"; case "$arch" in amd64|arm64) EXTRA_CFLAGS="${EXTRA_CFLAGS:-} -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer"; ;; i386) ;; *) EXTRA_CFLAGS="${EXTRA_CFLAGS:-} -fno-omit-frame-pointer"; ;; esac; make -j "$nproc" "EXTRA_CFLAGS=${EXTRA_CFLAGS:-}" "LDFLAGS=${LDFLAGS:-}" ; rm python; make -j "$nproc" "EXTRA_CFLAGS=${EXTRA_CFLAGS:-}" "LDFLAGS=${LDFLAGS:-} -Wl,-rpath='\$\$ORIGIN/../lib'" python ; make install; cd /; rm -rf /usr/src/python; find /usr/local -depth \( \( -type d -a \( -name test -o -name tests -o -name idle_test \) \) -o \( -type f -a \( -name '*.pyc' -o -name '*.pyo' -o -name 'libpython*.a' \) \) \) -exec rm -rf '{}' + ; ldconfig; apt-mark auto '.*' > /dev/null; apt-mark manual $savedAptMark; find /usr/local -type f -executable -not \( -name '*tkinter*' \) -exec ldd '{}' ';' | awk '/=>/ { so = $(NF-1); if (index(so, "/usr/local/") == 1) { next }; gsub("^/(usr/)?", "", so); printf "*%s\n", so }' | sort -u | xargs -rt dpkg-query --search | awk 'sub(":$", "", $1) { print $1 }' | sort -u | xargs -r apt-mark manual ; apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false; apt-get dist-clean; export PYTHONDONTWRITEBYTECODE=1; python3 --version; pip3 --version # buildkit |
| RUN /bin/sh -c set -eux; for src in idle3 pip3 pydoc3 python3 python3-config; do dst="$(echo "$src" | tr -d 3)"; [ -s "/usr/local/bin/$src" ]; [ ! -e "/usr/local/bin/$dst" ]; ln -svT "$src" "/usr/local/bin/$dst"; done # buildkit |
| CMD ["python3"] |
| ARG RELAYTV_INSTALL_QT=1 |
| ARG RELAYTV_INSTALL_X11_OVERLAY=0 |
| ARG RELAYTV_INSTALL_HEADLESS=0 |
| ARG RELAYTV_INSTALL_NODE=1 |
| ARG RELAYTV_INSTALL_DENO=1 |
| ARG RELAYTV_DENO_VERSION=2.9.1 |
| ARG RELAYTV_INSTALL_IDLE_BROWSER=0 |
| ARG RELAYTV_INSTALL_OPS_TOOLS=0 |
| RUN |8 RELAYTV_INSTALL_QT=1 RELAYTV_INSTALL_X11_OVERLAY=0 RELAYTV_INSTALL_HEADLESS=0 RELAYTV_INSTALL_NODE=1 RELAYTV_INSTALL_DENO=1 RELAYTV_DENO_VERSION=2.9.1 RELAYTV_INSTALL_IDLE_BROWSER=0 RELAYTV_INSTALL_OPS_TOOLS=0 /bin/sh -c set -eux; apt-get update; pkg_is_installable() { candidate="$(apt-cache policy "$1" | awk '/Candidate:/ {print $2}')"; [ -n "$candidate" ] && [ "$candidate" != "(none)" ]; }; pkgs="mpv libmpv2 cec-utils ca-certificates curl ffmpeg alsa-utils mesa-va-drivers mesa-vulkan-drivers libva-drm2 libdrm2 libgbm1 libegl1 libvulkan1 libwayland-client0 libwayland-cursor0 libwayland-egl1 libgl1-mesa-dri fontconfig fonts-noto-color-emoji"; if pkg_is_installable libgl1-mesa-glx; then pkgs="$pkgs libgl1-mesa-glx"; else pkgs="$pkgs libgl1"; fi; if pkg_is_installable libgles2-mesa; then pkgs="$pkgs libgles2-mesa"; else pkgs="$pkgs libgles2"; fi; if [ "${RELAYTV_INSTALL_NODE}" = "1" ]; then pkgs="$pkgs nodejs"; fi; if [ "${RELAYTV_INSTALL_HEADLESS}" = "1" ]; then pkgs="$pkgs xvfb x11vnc"; fi; if [ "${RELAYTV_INSTALL_OPS_TOOLS}" = "1" ]; then pkgs="$pkgs mesa-utils procps socat"; fi; if [ "${RELAYTV_INSTALL_X11_OVERLAY}" = "1" ]; then pkgs="$pkgs python3-gi gir1.2-gtk-3.0"; if pkg_is_installable gir1.2-webkit2-4.1; then pkgs="$pkgs gir1.2-webkit2-4.1"; elif pkg_is_installable gir1.2-webkit2-4.0; then pkgs="$pkgs gir1.2-webkit2-4.0"; fi; if pkg_is_installable libwebkit2gtk-4.1-0; then pkgs="$pkgs libwebkit2gtk-4.1-0"; elif pkg_is_installable libwebkit2gtk-4.0-37; then pkgs="$pkgs libwebkit2gtk-4.0-37"; fi; fi; if [ "${RELAYTV_INSTALL_QT}" = "1" ]; then qt_pkgs="libnss3 libnspr4 libxcomposite1 libxdamage1 libxkbcommon0 libxkbcommon-x11-0 libxkbfile1 libxrandr2 libatk-bridge2.0-0 libasound2 libx11-xcb1 libxcb-cursor0 libxcb-glx0 libxcb-icccm4 libxcb-image0 libxcb-keysyms1 libxcb-randr0 libxcb-render-util0 libxcb-shape0 libxcb-xfixes0"; if pkg_is_installable qt6-wayland; then qt_pkgs="$qt_pkgs qt6-wayland"; fi; if pkg_is_installable qt6-webengine; then qt_pkgs="$qt_pkgs qt6-webengine"; fi; if pkg_is_installable libqt6webenginecore6; then qt_pkgs="$qt_pkgs libqt6webenginecore6"; fi; if pkg_is_installable libqt6webenginewidgets6; then qt_pkgs="$qt_pkgs libqt6webenginewidgets6"; fi; if pkg_is_installable libqt6openglwidgets6; then qt_pkgs="$qt_pkgs libqt6openglwidgets6"; fi; if [ "${RELAYTV_INSTALL_IDLE_BROWSER}" = "1" ] && pkg_is_installable chromium; then qt_pkgs="$qt_pkgs chromium"; fi; pkgs="$pkgs $qt_pkgs"; fi; apt-get install -y --no-install-recommends $pkgs; arch="$(dpkg --print-architecture)"; case "$arch" in arm64) libdir="/usr/lib/aarch64-linux-gnu" ;; amd64) libdir="/usr/lib/x86_64-linux-gnu" ;; *) libdir="/usr/lib" ;; esac; if [ -d "$libdir/dri" ] && [ ! -e "$libdir/mesa" ]; then ln -s "$libdir/dri" "$libdir/mesa"; fi; rm -rf /var/lib/apt/lists/* # buildkit |
| RUN |8 RELAYTV_INSTALL_QT=1 RELAYTV_INSTALL_X11_OVERLAY=0 RELAYTV_INSTALL_HEADLESS=0 RELAYTV_INSTALL_NODE=1 RELAYTV_INSTALL_DENO=1 RELAYTV_DENO_VERSION=2.9.1 RELAYTV_INSTALL_IDLE_BROWSER=0 RELAYTV_INSTALL_OPS_TOOLS=0 /bin/sh -c set -eux; if [ "${RELAYTV_INSTALL_DENO}" = "1" ]; then arch="$(dpkg --print-architecture)"; case "$arch" in amd64) deno_target="x86_64-unknown-linux-gnu"; deno_sha256="710c54d63477d1100844ef4818f19507ce0dbf40510903b1d883f19e394446a2" ;; arm64) deno_target="aarch64-unknown-linux-gnu"; deno_sha256="0a60d079fa79635a59803074dbbfe86ccc35746dc2c4f8d73f2e50338b3283a9" ;; *) deno_target="" ;; esac; if [ -n "$deno_target" ]; then curl -fsSL -o /tmp/deno.zip "https://github.com/denoland/deno/releases/download/v${RELAYTV_DENO_VERSION}/deno-${deno_target}.zip"; echo "${deno_sha256} /tmp/deno.zip" | sha256sum -c -; python3 -m zipfile -e /tmp/deno.zip /usr/local/bin/; chmod 0755 /usr/local/bin/deno; rm -f /tmp/deno.zip; deno --version; fi; fi # buildkit |
| ENV PYTHONPATH=/usr/lib/python3/dist-packages |
| RUN |8 RELAYTV_INSTALL_QT=1 RELAYTV_INSTALL_X11_OVERLAY=0 RELAYTV_INSTALL_HEADLESS=0 RELAYTV_INSTALL_NODE=1 RELAYTV_INSTALL_DENO=1 RELAYTV_DENO_VERSION=2.9.1 RELAYTV_INSTALL_IDLE_BROWSER=0 RELAYTV_INSTALL_OPS_TOOLS=0 /bin/sh -c set -eux; pip install --no-cache-dir yt-dlp fastapi uvicorn[standard] zeroconf qrcode python-multipart; if [ "${RELAYTV_INSTALL_QT}" = "1" ]; then pip install --no-cache-dir PySide6; fi # buildkit |
| ARG RELAYTV_IMAGE_SOURCE=https://git.relaytv.app/RelayTV/RelayTV |
| ARG RELAYTV_IMAGE_REVISION=e4bec6d8212d0e304d4338448e44510efbc19f58 |
| ARG RELAYTV_IMAGE_VERSION=main |
| ARG RELAYTV_IMAGE_CREATED= |
| LABEL org.opencontainers.image.title=RelayTV org.opencontainers.image.description=Local-first TV playback and automation endpoint org.opencontainers.image.source=https://git.relaytv.app/RelayTV/RelayTV org.opencontainers.image.revision=e4bec6d8212d0e304d4338448e44510efbc19f58 org.opencontainers.image.version=main org.opencontainers.image.created= org.opencontainers.image.licenses=GPL-3.0-only |
| ENV RELAYTV_IMAGE_SOURCE=https://git.relaytv.app/RelayTV/RelayTV RELAYTV_IMAGE_REVISION=e4bec6d8212d0e304d4338448e44510efbc19f58 RELAYTV_IMAGE_VERSION=main RELAYTV_IMAGE_CREATED= |
| WORKDIR /app |
| COPY app/relaytv_app /app/relaytv_app # buildkit |
| COPY LICENSE COPYING THIRD_PARTY_LICENSES.md ASSETS.md /usr/share/doc/relaytv/ # buildkit |
| RUN |12 RELAYTV_INSTALL_QT=1 RELAYTV_INSTALL_X11_OVERLAY=0 RELAYTV_INSTALL_HEADLESS=0 RELAYTV_INSTALL_NODE=1 RELAYTV_INSTALL_DENO=1 RELAYTV_DENO_VERSION=2.9.1 RELAYTV_INSTALL_IDLE_BROWSER=0 RELAYTV_INSTALL_OPS_TOOLS=0 RELAYTV_IMAGE_SOURCE=https://git.relaytv.app/RelayTV/RelayTV RELAYTV_IMAGE_REVISION=e4bec6d8212d0e304d4338448e44510efbc19f58 RELAYTV_IMAGE_VERSION=main RELAYTV_IMAGE_CREATED= /bin/sh -c chmod -R a+rX /app/relaytv_app /usr/share/doc/relaytv # buildkit |
| RUN |12 RELAYTV_INSTALL_QT=1 RELAYTV_INSTALL_X11_OVERLAY=0 RELAYTV_INSTALL_HEADLESS=0 RELAYTV_INSTALL_NODE=1 RELAYTV_INSTALL_DENO=1 RELAYTV_DENO_VERSION=2.9.1 RELAYTV_INSTALL_IDLE_BROWSER=0 RELAYTV_INSTALL_OPS_TOOLS=0 RELAYTV_IMAGE_SOURCE=https://git.relaytv.app/RelayTV/RelayTV RELAYTV_IMAGE_REVISION=e4bec6d8212d0e304d4338448e44510efbc19f58 RELAYTV_IMAGE_VERSION=main RELAYTV_IMAGE_CREATED= /bin/sh -c set -eux; if [ -d /app/relaytv_app/static/weather ]; then mkdir -p /app/relaytv_app/static/pwa/weather; cp -a /app/relaytv_app/static/weather/. /app/relaytv_app/static/pwa/weather/; fi # buildkit |
| RUN |12 RELAYTV_INSTALL_QT=1 RELAYTV_INSTALL_X11_OVERLAY=0 RELAYTV_INSTALL_HEADLESS=0 RELAYTV_INSTALL_NODE=1 RELAYTV_INSTALL_DENO=1 RELAYTV_DENO_VERSION=2.9.1 RELAYTV_INSTALL_IDLE_BROWSER=0 RELAYTV_INSTALL_OPS_TOOLS=0 RELAYTV_IMAGE_SOURCE=https://git.relaytv.app/RelayTV/RelayTV RELAYTV_IMAGE_REVISION=e4bec6d8212d0e304d4338448e44510efbc19f58 RELAYTV_IMAGE_VERSION=main RELAYTV_IMAGE_CREATED= /bin/sh -c set -eux; if [ -d /app/relaytv_app/static/brand ]; then mkdir -p /data/assets; if [ -f /app/relaytv_app/static/brand/splash.png ]; then cp -a /app/relaytv_app/static/brand/splash.png /data/assets/splash.png; fi; if [ -f /app/relaytv_app/static/brand/logo.svg ]; then cp -a /app/relaytv_app/static/brand/logo.svg /data/assets/logo.svg; fi; fi # buildkit |
| RUN |12 RELAYTV_INSTALL_QT=1 RELAYTV_INSTALL_X11_OVERLAY=0 RELAYTV_INSTALL_HEADLESS=0 RELAYTV_INSTALL_NODE=1 RELAYTV_INSTALL_DENO=1 RELAYTV_DENO_VERSION=2.9.1 RELAYTV_INSTALL_IDLE_BROWSER=0 RELAYTV_INSTALL_OPS_TOOLS=0 RELAYTV_IMAGE_SOURCE=https://git.relaytv.app/RelayTV/RelayTV RELAYTV_IMAGE_REVISION=e4bec6d8212d0e304d4338448e44510efbc19f58 RELAYTV_IMAGE_VERSION=main RELAYTV_IMAGE_CREATED= /bin/sh -c ! grep -R -n -E '^(<<<<<<<|=======|>>>>>>>)' /app/relaytv_app # buildkit |
| EXPOSE [8787/tcp] |
| ENTRYPOINT ["python" "-m" "relaytv_app.container_entrypoint"] |