One-KVM/build/Dockerfile-stage-0
mofeng-git bbef7bb5c4 fix: 修复Docker多架构构建中FFmpeg库依赖问题
- 修复arm64-libs.tar.gz条件复制,使用通配符避免文件不存在错误
- 在stage-0中添加arm64架构FFmpeg库的条件复制
- 添加libyuv0依赖包支持
- 确保只在arm64下复制自定义编译的FFmpeg相关库文件
2025-08-25 22:39:27 +08:00

201 lines
8.0 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# syntax = docker/dockerfile:experimental
FROM debian:bookworm-slim AS builder
ARG TARGETARCH
# 设置环境变量
ENV DEBIAN_FRONTEND=noninteractive \
PIP_NO_CACHE_DIR=1 \
RUSTUP_DIST_SERVER="https://mirrors.tuna.tsinghua.edu.cn/rustup"
# 更新源并安装依赖
RUN sed -i 's/deb.debian.org/mirrors.tuna.tsinghua.edu.cn/' /etc/apt/sources.list.d/debian.sources \
&& apt-get update \
&& apt-get install -y --no-install-recommends \
python3-full \
python3-pip \
python3-dev \
build-essential \
libssl-dev \
libffi-dev \
python3-dev \
libevent-dev \
libjpeg-dev \
libbsd-dev \
libudev-dev \
git \
pkg-config \
wget \
curl \
libmicrohttpd-dev \
libjansson-dev \
libsofia-sip-ua-dev \
libglib2.0-dev \
libopus-dev \
libogg-dev \
libcurl4-openssl-dev \
liblua5.3-dev \
libconfig-dev \
libtool \
automake \
autoconf \
meson \
cmake \
libx264-dev \
libyuv-dev \
libasound2-dev \
libspeex-dev \
libspeexdsp-dev \
libusb-1.0-0-dev \
libldap2-dev \
libsasl2-dev \
libdrm-dev \
mesa-va-drivers \
mesa-vdpau-drivers \
v4l-utils \
libv4l-dev \
&& if [ ${TARGETARCH} != arm64 ]; then \
apt-get install -y --no-install-recommends \
ffmpeg \
libavcodec-dev \
libavformat-dev \
libavutil-dev \
libswscale-dev \
libavfilter-dev \
libavdevice-dev; \
fi \
&& if [ ${TARGETARCH} != arm ] && [ ${TARGETARCH} != arm64 ]; then \
apt-get install -y --no-install-recommends \
vainfo \
libva-dev \
libva-drm2 \
libva-x11-2 \
intel-media-va-driver \
i965-va-driver; \
fi \
&& if [ ${TARGETARCH} = arm64 ]; then \
apt-get install -y --no-install-recommends \
ninja-build \
zlib1g-dev \
libswresample-dev; \
fi \
&& apt clean \
&& rm -rf /var/lib/apt/lists/*
COPY build/cargo_config /tmp/config
# 配置 pip 源并安装 Python 依赖
RUN --security=insecure pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple \
&& if [ ${TARGETARCH} = arm ]; then \
mkdir -p /root/.cargo \
&& chmod 777 /root/.cargo && mount -t tmpfs none /root/.cargo \
&& wget https://sh.rustup.rs -O /root/rustup-init.sh \
&& sh /root/rustup-init.sh -y \
&& export PATH=$PATH:/root/.cargo/bin \
&& cp /tmp/config /root/.cargo/config.toml; \
fi \
&& pip install --root-user-action=ignore --disable-pip-version-check --upgrade --break-system-packages build setuptools pip \
&& pip wheel --wheel-dir=/tmp/wheel/ cryptography \
&& pip wheel --wheel-dir=/tmp/wheel/ \
aiofiles aiohttp appdirs asn1crypto async_lru async-timeout bottle cffi \
chardet click colorama dbus_next gpiod hidapi idna mako marshmallow \
more-itertools multidict netifaces packaging passlib pillow ply psutil \
pycparser pyelftools pyghmi pygments pyparsing pyotp qrcode requests \
semantic-version setproctitle six spidev tabulate urllib3 wrapt xlib \
yarl pyserial pyyaml zstandard supervisor pyfatfs pyserial python-periphery \
python-ldap python-pam pyrad pyudev pyusb luma.oled pyserial-asyncio \
&& rm -rf /root/.cache/pip/* /tmp/pip-* \
&& if [ ${TARGETARCH} = arm ]; then \
umount /root/.cargo 2>/dev/null || true \
&& rm -rf /root/.cargo /root/rustup-init.sh; \
fi
# 编译 python evdev库
RUN git clone --depth=1 https://github.com/gvalkov/python-evdev.git /tmp/python-evdev \
&& cd /tmp/python-evdev \
&& python3 setup.py bdist_wheel --dist-dir /tmp/wheel/ \
&& rm -rf /tmp/python-evdev
# 编译安装 libnice、libsrtp、libwebsockets 和 janus-gateway
RUN git clone --depth=1 https://gitlab.freedesktop.org/libnice/libnice /tmp/libnice \
&& cd /tmp/libnice \
&& meson --prefix=/usr build && ninja -C build && ninja -C build install \
&& rm -rf /tmp/libnice \
&& curl https://github.com/cisco/libsrtp/archive/v2.2.0.tar.gz -L -o /tmp/libsrtp-2.2.0.tar.gz \
&& cd /tmp \
&& tar xf libsrtp-2.2.0.tar.gz \
&& cd libsrtp-2.2.0 \
&& ./configure --prefix=/usr --enable-openssl \
&& make shared_library -j$(nproc) && make install \
&& cd /tmp \
&& rm -rf /tmp/libsrtp* \
&& git clone --depth=1 https://github.com/warmcat/libwebsockets /tmp/libwebsockets \
&& cd /tmp/libwebsockets \
&& mkdir build && cd build \
&& cmake -DLWS_MAX_SMP=1 -DLWS_WITHOUT_EXTENSIONS=0 -DCMAKE_INSTALL_PREFIX:PATH=/usr -DCMAKE_C_FLAGS="-fpic" .. \
&& make -j$(nproc) && make install \
&& cd /tmp \
&& rm -rf /tmp/libwebsockets \
&& git clone --depth=1 https://github.com/meetecho/janus-gateway.git /tmp/janus-gateway \
&& cd /tmp/janus-gateway \
&& sh autogen.sh \
&& ./configure --enable-static --enable-websockets --enable-plugin-audiobridge \
--disable-data-channels --disable-rabbitmq --disable-mqtt --disable-all-plugins \
--disable-all-loggers --prefix=/usr \
&& make -j$(nproc) && make install \
&& cd /tmp \
&& rm -rf /tmp/janus-gateway
# 编译 Rockchip MPP、RGA 和 FFmpeg仅 arm64
RUN if [ ${TARGETARCH} = arm64 ]; then \
git clone -b jellyfin-mpp --depth=1 https://github.com/nyanmisaka/mpp.git /tmp/rkmpp \
&& mkdir -p /tmp/rkmpp/rkmpp_build && cd /tmp/rkmpp/rkmpp_build \
&& cmake -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=ON -DBUILD_TEST=OFF .. \
&& make -j$(nproc) \
&& make install \
&& make install DESTDIR=/opt \
&& git clone -b jellyfin-rga --depth=1 https://github.com/nyanmisaka/rk-mirrors.git /tmp/rkrga \
&& cd /tmp/ \
&& meson setup rkrga rkrga_build --prefix=/usr --libdir=lib --buildtype=release -Dcpp_args=-fpermissive -Dlibdrm=false -Dlibrga_demo=false \
&& meson configure rkrga_build > /dev/null \
&& ninja -C rkrga_build install \
&& DESTDIR=/opt ninja -C rkrga_build install \
&& git clone https://github.com/nyanmisaka/ffmpeg-rockchip.git /tmp/ffmpeg-rockchip \
&& cd /tmp/ffmpeg-rockchip \
&& ./configure --prefix=/usr --enable-gpl --enable-version3 --enable-libdrm --enable-rkmpp --enable-rkrga \
--enable-libv4l2 --enable-libx264 --enable-shared --disable-programs \
--disable-doc --disable-htmlpages --disable-manpages --disable-network --disable-protocols \
--disable-decoders --disable-debug --disable-alsa \
&& make -j$(nproc) \
&& make install \
&& make install DESTDIR=/opt \
&& cd /opt && tar -czf /tmp/arm64-libs.tar.gz usr/ \
&& rm -rf /tmp/rkmpp /tmp/rkrga /tmp/ffmpeg-rockchip /opt/usr; \
fi
# 编译 ustreamer
RUN echo "Building ustreamer with timestamp cache bust" \
&& sed --in-place --expression 's|^#include "refcount.h"$|#include "../refcount.h"|g' /usr/include/janus/plugins/plugin.h \
&& TIMESTAMP=$(date +%s%N) \
&& git clone --depth=1 https://github.com/mofeng-git/ustreamer /tmp/ustreamer-${TIMESTAMP} \
&& make -j$(nproc) WITH_PYTHON=1 WITH_JANUS=1 WITH_FFMPEG=1 -C /tmp/ustreamer-${TIMESTAMP} \
&& /tmp/ustreamer-${TIMESTAMP}/ustreamer -v \
&& /tmp/ustreamer-${TIMESTAMP}/ustreamer-dump -v \
&& cp /tmp/ustreamer-${TIMESTAMP}/python/dist/*.whl /tmp/wheel/ \
&& mv /tmp/ustreamer-${TIMESTAMP} /tmp/ustreamer
# 复制必要的库文件
RUN mkdir /tmp/lib \
&& cd /lib/*-linux-*/ \
&& cp libevent_core-*.so.* libbsd.so.* libevent_pthreads-*.so.* libspeexdsp.so.* \
libevent-*.so.* libjpeg.so.* libyuv.so.* libnice.so.* \
/tmp/lib/ \
&& find /usr/lib -name "libsrtp2.so.*" -exec cp {} /tmp/lib/ \; \
&& find /usr/lib -name "libwebsockets.so.*" -exec cp {} /tmp/lib/ \; \
&& if [ ${TARGETARCH} = arm64 ]; then \
find /usr/lib -name "libav*.so.*" -exec cp {} /tmp/lib/ \; \
&& find /usr/lib -name "libsw*.so.*" -exec cp {} /tmp/lib/ \; \
&& find /usr/lib -name "libpostproc.so.*" -exec cp {} /tmp/lib/ \; \
&& find /usr/lib -name "librga.so.*" -exec cp {} /tmp/lib/ \; ; \
fi