mirror of
https://github.com/blakeblackshear/frigate.git
synced 2026-02-14 15:15:22 +03:00
This change migrates the frigate container build to use Debian trixie as the base image. This permits us to use newer upstream packages (and, for example, stop needing to use a custom ffmpeg build). The main hitch was the need for Python 3.9 for Pycoral from the Google apt repository, for Coral Edge TPU support. Fortunately, the open source community has stepped up, and there are now TFLite and Pycoral wheels available for Python 3.10-3.12 as well.
332 lines
11 KiB
Docker
332 lines
11 KiB
Docker
# syntax=docker/dockerfile:1.6
|
|
|
|
ARG BASE_IMAGE=debian:testing
|
|
ARG SLIM_BASE=debian:testing-slim
|
|
|
|
FROM ${BASE_IMAGE} AS base
|
|
|
|
FROM --platform=${BUILDPLATFORM} ${BASE_IMAGE} AS base_host
|
|
|
|
FROM ${SLIM_BASE} AS slim-base
|
|
|
|
FROM slim-base AS wget
|
|
RUN set -eux; \
|
|
DEBIAN_FRONTEND=noninteractive; \
|
|
export DEBIAN_FRONTEND; \
|
|
apt -y update; \
|
|
apt -y install wget xz-utils; \
|
|
rm -rf /var/lib/apt/lists/* /var/cache/apt/archives/*
|
|
WORKDIR /rootfs
|
|
|
|
FROM base AS nginx
|
|
ARG DEBIAN_FRONTEND
|
|
ENV CCACHE_DIR /root/.ccache
|
|
ENV CCACHE_MAXSIZE 2G
|
|
|
|
# bind /var/cache/apt to tmpfs to speed up nginx build
|
|
RUN --mount=type=tmpfs,target=/tmp --mount=type=tmpfs,target=/var/cache/apt \
|
|
--mount=type=bind,source=docker/main/build_nginx.sh,target=/deps/build_nginx.sh \
|
|
--mount=type=cache,target=/root/.ccache \
|
|
set -eux; \
|
|
/deps/build_nginx.sh
|
|
|
|
FROM scratch AS go2rtc
|
|
ARG TARGETARCH
|
|
WORKDIR /rootfs/usr/local/go2rtc/bin
|
|
ADD --link --chmod=755 "https://github.com/AlexxIT/go2rtc/releases/download/v1.9.2/go2rtc_linux_${TARGETARCH}" go2rtc
|
|
|
|
FROM wget AS tempio
|
|
ARG TARGETARCH
|
|
RUN --mount=type=bind,source=docker/main/install_tempio.sh,target=/deps/install_tempio.sh \
|
|
set -eux; \
|
|
/deps/install_tempio.sh
|
|
|
|
####
|
|
#
|
|
# OpenVino Support
|
|
#
|
|
# 1. Download and convert a model from Intel's Public Open Model Zoo
|
|
#
|
|
####
|
|
# Download and Convert OpenVino model
|
|
FROM base_host AS ov-converter
|
|
|
|
# Install OpenVino Runtime and Dev library
|
|
COPY docker/main/requirements-ov.txt /requirements-ov.txt
|
|
RUN set -eux; \
|
|
DEBIAN_FRONTEND=noninteractive; \
|
|
export DEBIAN_FRONTEND; \
|
|
apt -qq update; \
|
|
apt -qq -y install wget python3 python3-dev python3-setuptools python3-pip gcc pkg-config libhdf5-dev; \
|
|
pip install --break-system-packages -r /requirements-ov.txt; \
|
|
rm -rf /var/lib/apt/lists/* /var/cache/apt/archives/* ~/.cache/pip
|
|
|
|
# Get OpenVino Model
|
|
RUN --mount=type=bind,source=docker/main/build_ov_model.py,target=/build_ov_model.py \
|
|
set -eux; \
|
|
mkdir -p /models; \
|
|
cd /models; \
|
|
weights_tarball=ssdlite_mobilenet_v2_coco_2018_05_09.tar.gz; \
|
|
wget http://download.tensorflow.org/models/object_detection/$weights_tarball; \
|
|
tar xzf $weights_tarball; \
|
|
python3 /build_ov_model.py; \
|
|
rm -f $weights_tarball
|
|
|
|
####
|
|
#
|
|
# Coral Compatibility
|
|
#
|
|
# Builds libusb without udev. Needed for synology and other devices with USB coral
|
|
####
|
|
# libUSB - No Udev
|
|
FROM wget as libusb-build
|
|
ARG TARGETARCH
|
|
ARG DEBIAN_FRONTEND
|
|
ENV CCACHE_DIR /root/.ccache
|
|
ENV CCACHE_MAXSIZE 2G
|
|
|
|
# Build libUSB without udev. Needed for Openvino NCS2 support
|
|
WORKDIR /opt
|
|
RUN --mount=type=cache,target=/root/.ccache \
|
|
set -eux; \
|
|
DEBIAN_FRONTEND=noninteractive; \
|
|
export DEBIAN_FRONTEND; \
|
|
apt -y update; \
|
|
apt -y install unzip build-essential automake libtool ccache pkg-config; \
|
|
apt -y install --no-install-recommends libusb-1.0-0-dev; \
|
|
libusb_version=1.0.27; \
|
|
wget -q https://github.com/libusb/libusb/archive/v${libusb_version}.zip -O v${libusb_version}.zip; \
|
|
unzip v${libusb_version}.zip; \
|
|
cd libusb-${libusb_version}; \
|
|
./bootstrap.sh; \
|
|
./configure CC='ccache gcc' CCX='ccache g++' --disable-udev --enable-shared; \
|
|
make -j $(nproc --all); \
|
|
rm -rf /var/lib/apt/lists/* /var/cache/apt/archives/*
|
|
WORKDIR /opt/libusb-1.0.27/libusb
|
|
RUN set -eux; \
|
|
/bin/mkdir -p '/usr/local/lib'; \
|
|
/bin/bash ../libtool --mode=install /usr/bin/install -c libusb-1.0.la '/usr/local/lib'; \
|
|
/bin/mkdir -p '/usr/local/include/libusb-1.0'; \
|
|
/usr/bin/install -c -m 644 libusb.h '/usr/local/include/libusb-1.0'; \
|
|
/bin/mkdir -p '/usr/local/lib/pkgconfig'; \
|
|
cd /opt/libusb-1.0.27/; \
|
|
/usr/bin/install -c -m 644 libusb-1.0.pc '/usr/local/lib/pkgconfig'; \
|
|
ldconfig
|
|
|
|
FROM wget AS models
|
|
|
|
# Get model and labels
|
|
RUN set -eux; \
|
|
wget -qO edgetpu_model.tflite https://github.com/google-coral/test_data/raw/release-frogfish/ssdlite_mobiledet_coco_qat_postprocess_edgetpu.tflite; \
|
|
wget -qO cpu_model.tflite https://github.com/google-coral/test_data/raw/release-frogfish/ssdlite_mobiledet_coco_qat_postprocess.tflite
|
|
COPY labelmap.txt .
|
|
# Copy OpenVino model
|
|
COPY --from=ov-converter /models/ssdlite_mobilenet_v2.xml openvino-model/
|
|
COPY --from=ov-converter /models/ssdlite_mobilenet_v2.bin openvino-model/
|
|
RUN set -eux; \
|
|
wget -q https://github.com/openvinotoolkit/open_model_zoo/raw/master/data/dataset_classes/coco_91cl_bkgr.txt -O openvino-model/coco_91cl_bkgr.txt; \
|
|
sed -i 's/truck/car/g' openvino-model/coco_91cl_bkgr.txt; \
|
|
wget -qO - https://www.kaggle.com/api/v1/models/google/yamnet/tfLite/classification-tflite/1/download | \
|
|
tar xzf -; \
|
|
mv 1.tflite cpu_audio_model.tflite # Get Audio Model and labels
|
|
COPY audio-labelmap.txt .
|
|
|
|
|
|
FROM wget AS s6-overlay
|
|
ARG TARGETARCH
|
|
RUN --mount=type=bind,source=docker/main/install_s6_overlay.sh,target=/deps/install_s6_overlay.sh \
|
|
set -eux; \
|
|
/deps/install_s6_overlay.sh
|
|
|
|
|
|
FROM base AS wheels
|
|
ARG TARGETARCH
|
|
|
|
# Use a separate container to build wheels to prevent build dependencies in final image
|
|
RUN set -eux; \
|
|
DEBIAN_FRONTEND=noninteractive; \
|
|
export DEBIAN_FRONTEND; \
|
|
apt -qq -y update; \
|
|
apt -qq -y install apt-transport-https gnupg wget ca-certificates; \
|
|
(echo "deb https://cdn-aws.deb.debian.org/debian testing main contrib non-free non-free-firmware"; \
|
|
echo "deb https://cdn-aws.deb.debian.org/debian stable main contrib non-free non-free-firmware"; \
|
|
echo "deb https://cdn-aws.deb.debian.org/debian stable-updates main contrib non-free non-free-firmware"; \
|
|
echo "deb https://cdn-aws.deb.debian.org/debian-security/ stable-security main contrib non-free non-free-firmware") | \
|
|
tee /etc/apt/sources.list.d/debian-testing-nonfree.list; \
|
|
|
|
apt -y -qq update; \
|
|
apt -y -qq install python3 python3-dev python3-pip python3-setuptools \
|
|
# opencv dependencies
|
|
build-essential cmake git pkg-config libgtk-3-dev \
|
|
libavcodec-dev libavformat-dev libswscale-dev libv4l-dev \
|
|
libxvidcore-dev libx264-dev libjpeg-dev libpng-dev libtiff-dev \
|
|
gfortran openexr libatlas-base-dev libssl-dev\
|
|
libtbbmalloc2 libtbb-dev libdc1394-dev libopenexr-dev \
|
|
libgstreamer-plugins-base1.0-dev libgstreamer1.0-dev \
|
|
# sqlite3 dependencies
|
|
tclsh \
|
|
# scipy dependencies
|
|
gcc gfortran libopenblas-dev liblapack-dev; \
|
|
rm -rf /var/lib/apt/lists/* /var/cache/apt/archives/*
|
|
|
|
COPY docker/main/requirements.txt /requirements.txt
|
|
RUN set -eux; \
|
|
mkdir -p /root/wheel-build; \
|
|
cd /root/wheel-build; \
|
|
pip3 download nvidia-pyindex==1.0.9; \
|
|
tar xzf nvidia-pyindex-1.0.9.tar.gz; \
|
|
cd nvidia-pyindex-1.0.9; \
|
|
pip3 wheel .; \
|
|
pip3 install --break-system-packages nvidia_pyindex*whl; \
|
|
mkdir -p /wheels; \
|
|
mv *.whl /wheels; \
|
|
cd; \
|
|
pip3 install --break-system-packages -r /requirements.txt; \
|
|
rm -rf /root/.cache/pip /root/wheel-build
|
|
|
|
# Build pysqlite3 from source to support ChromaDB
|
|
COPY docker/main/build_pysqlite3.sh /build_pysqlite3.sh
|
|
RUN set -eux; \
|
|
/build_pysqlite3.sh
|
|
|
|
COPY docker/main/requirements-wheels.txt /requirements-wheels.txt
|
|
RUN set -eux; \
|
|
pip3 wheel --wheel-dir=/wheels -r /requirements-wheels.txt
|
|
|
|
# Collect deps in a single layer
|
|
FROM scratch AS deps-rootfs
|
|
COPY --from=nginx /usr/local/nginx/ /usr/local/nginx/
|
|
COPY --from=go2rtc /rootfs/ /
|
|
COPY --from=libusb-build /usr/local/lib /usr/local/lib
|
|
COPY --from=tempio /rootfs/ /
|
|
COPY --from=s6-overlay /rootfs/ /
|
|
COPY --from=models /rootfs/ /
|
|
COPY docker/main/rootfs/ /
|
|
|
|
|
|
# Frigate deps (ffmpeg, python, nginx, go2rtc, s6-overlay, etc)
|
|
FROM slim-base AS deps
|
|
ARG TARGETARCH
|
|
|
|
# http://stackoverflow.com/questions/48162574/ddg#49462622
|
|
ARG APT_KEY_DONT_WARN_ON_DANGEROUS_USAGE=DontWarn
|
|
|
|
# https://github.com/NVIDIA/nvidia-docker/wiki/Installation-(Native-GPU-Support)
|
|
ENV NVIDIA_VISIBLE_DEVICES=all
|
|
ENV NVIDIA_DRIVER_CAPABILITIES="compute,video,utility"
|
|
|
|
# Turn off Chroma Telemetry: https://docs.trychroma.com/telemetry#opting-out
|
|
ENV ANONYMIZED_TELEMETRY=False
|
|
# Allow resetting the chroma database
|
|
ENV ALLOW_RESET=True
|
|
# Disable tokenizer parallelism warning
|
|
ENV TOKENIZERS_PARALLELISM=true
|
|
|
|
ENV PATH="/usr/local/go2rtc/bin:/usr/local/tempio/bin:/usr/local/nginx/sbin:${PATH}"
|
|
|
|
# Install dependencies
|
|
RUN --mount=type=bind,source=docker/main/install_deps.sh,target=/deps/install_deps.sh \
|
|
set -eux; \
|
|
DEBIAN_FRONTEND=noninteractive; \
|
|
export DEBIAN_FRONTEND; \
|
|
keyring_pkg=deb-multimedia-keyring_2016.8.1_all.deb; \
|
|
apt -y update; \
|
|
apt -y install wget; \
|
|
wget -O /root/$keyring_pkg https://www.deb-multimedia.org/pool/main/d/deb-multimedia-keyring/$keyring_pkg; \
|
|
dpkg -i /root/$keyring_pkg; \
|
|
rm -f /root/$keyring_pkg; \
|
|
echo 'deb https://debian-mirrors.sdinet.de/deb-multimedia testing main non-free' > /etc/apt/sources.list.d/deb-multimedia.list; \
|
|
apt -y update; \
|
|
apt -y install ffmpeg; \
|
|
/deps/install_deps.sh
|
|
|
|
RUN --mount=type=bind,from=wheels,source=/wheels,target=/deps/wheels \
|
|
set -eux; \
|
|
DEBIAN_FRONTEND=noninteractive; \
|
|
export DEBIAN_FRONTEND; \
|
|
apt -y update; \
|
|
apt -y install python3-pip; \
|
|
rm -rf /var/lib/apt/lists/* /var/cache/apt/archives/*; \
|
|
pip3 install --break-system-packages -U /deps/wheels/*.whl
|
|
|
|
COPY --from=deps-rootfs / /
|
|
|
|
RUN set -eux; \
|
|
ldconfig
|
|
|
|
EXPOSE 5000
|
|
EXPOSE 8554
|
|
EXPOSE 8555/tcp 8555/udp
|
|
|
|
# Configure logging to prepend timestamps, log to stdout, keep 0 archives and rotate on 10MB
|
|
ENV S6_LOGGING_SCRIPT="T 1 n0 s10000000 T"
|
|
# Do not fail on long-running download scripts
|
|
ENV S6_CMD_WAIT_FOR_SERVICES_MAXTIME=0
|
|
|
|
ENTRYPOINT ["/init"]
|
|
CMD []
|
|
|
|
HEALTHCHECK --start-period=120s --start-interval=5s --interval=15s --timeout=5s --retries=3 \
|
|
CMD curl --fail --silent --show-error http://127.0.0.1:5000/api/version || exit 1
|
|
|
|
# Frigate deps with Node.js and NPM for devcontainer
|
|
FROM deps AS devcontainer
|
|
|
|
# Do not start the actual Frigate service on devcontainer as it will be started by VSCode
|
|
# But start a fake service for simulating the logs
|
|
COPY docker/main/fake_frigate_run /etc/s6-overlay/s6-rc.d/frigate/run
|
|
|
|
# Create symbolic link to the frigate source code, as go2rtc's create_config.sh uses it
|
|
RUN set -eux; \
|
|
mkdir -p /opt/frigate; \
|
|
ln -sf /workspace/frigate/frigate /opt/frigate/frigate
|
|
|
|
# Install Node 20
|
|
RUN set -eux; \
|
|
DEBIAN_FRONTEND=noninteractive; \
|
|
export DEBIAN_FRONTEND; \
|
|
apt -y update; \
|
|
apt -y install nodejs make; \
|
|
rm -rf /var/lib/apt/lists/* /var/cache/apt/archives/*; \
|
|
npm install -g npm@10
|
|
|
|
WORKDIR /workspace/frigate
|
|
|
|
RUN --mount=type=bind,source=./docker/main/requirements-dev.txt,target=/workspace/frigate/requirements-dev.txt \
|
|
set -eux; \
|
|
pip3 install -r requirements-dev.txt
|
|
|
|
HEALTHCHECK NONE
|
|
|
|
CMD ["sleep", "infinity"]
|
|
|
|
|
|
# Frigate web build
|
|
# This should be architecture agnostic, so speed up the build on multiarch by not using QEMU.
|
|
FROM --platform=$BUILDPLATFORM node:20 AS web-build
|
|
|
|
WORKDIR /work
|
|
COPY web/package.json web/package-lock.json ./
|
|
RUN set -eux; \
|
|
npm install
|
|
|
|
COPY web/ ./
|
|
RUN set -eux; \
|
|
npm run build; \
|
|
mv dist/BASE_PATH/monacoeditorwork/* dist/assets/; \
|
|
rm -rf dist/BASE_PATH
|
|
|
|
# Collect final files in a single layer
|
|
FROM scratch AS rootfs
|
|
|
|
WORKDIR /opt/frigate/
|
|
COPY frigate frigate/
|
|
COPY migrations migrations/
|
|
COPY --from=web-build /work/dist/ web/
|
|
|
|
# Frigate final container
|
|
FROM deps AS frigate
|
|
|
|
WORKDIR /opt/frigate/
|
|
COPY --from=rootfs / /
|