# syntax=docker/dockerfile:1.2 # https://askubuntu.com/questions/972516/debian-frontend-environment-variable ARG DEBIAN_FRONTEND=noninteractive FROM debian:11 AS base FROM debian:11-slim AS slim-base FROM blakeblackshear/frigate-nginx:1.0.2 AS nginx FROM slim-base AS wget ARG DEBIAN_FRONTEND RUN apt-get update \ && apt-get install -y wget \ && rm -rf /var/lib/apt/lists/* WORKDIR /rootfs FROM wget AS go2rtc ARG TARGETARCH WORKDIR /rootfs/usr/local/go2rtc/bin RUN wget -qO go2rtc "https://github.com/AlexxIT/go2rtc/releases/download/v0.1-rc.3/go2rtc_linux_${TARGETARCH}" \ && chmod +x go2rtc FROM wget AS models # Get model and labels RUN wget -qO edgetpu_model.tflite https://github.com/google-coral/test_data/raw/release-frogfish/ssdlite_mobiledet_coco_qat_postprocess_edgetpu.tflite RUN wget -qO cpu_model.tflite https://github.com/google-coral/test_data/raw/release-frogfish/ssdlite_mobiledet_coco_qat_postprocess.tflite COPY labelmap.txt . FROM wget AS s6-overlay ARG TARGETARCH RUN --mount=type=bind,source=docker/install_s6_overlay.sh,target=/deps/install_s6_overlay.sh \ /deps/install_s6_overlay.sh FROM base AS wheels ARG DEBIAN_FRONTEND # Use a separate container to build wheels to prevent build dependencies in final image RUN apt-get -qq update \ && apt-get -qq install -y \ apt-transport-https \ gnupg \ wget \ && apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 9165938D90FDDD2E \ && echo "deb http://raspbian.raspberrypi.org/raspbian/ bullseye main contrib non-free rpi" | tee /etc/apt/sources.list.d/raspi.list \ && apt-get -qq update \ && apt-get -qq install -y \ python3 \ python3-dev \ wget \ # 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\ libtbb2 libtbb-dev libdc1394-22-dev libopenexr-dev \ libgstreamer-plugins-base1.0-dev libgstreamer1.0-dev \ # scipy dependencies gcc gfortran libopenblas-dev liblapack-dev RUN wget -q https://bootstrap.pypa.io/get-pip.py -O get-pip.py \ && python3 get-pip.py "pip" RUN if [ "${TARGETARCH}" = "arm" ]; \ then echo "[global]" > /etc/pip.conf \ && echo "extra-index-url=https://www.piwheels.org/simple" >> /etc/pip.conf; \ fi COPY requirements.txt /requirements.txt RUN pip3 install -r requirements.txt COPY requirements-wheels.txt /requirements-wheels.txt RUN 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=s6-overlay /rootfs/ / COPY --from=models /rootfs/ / COPY docker/rootfs/ / # Frigate deps (ffmpeg, python, nginx, go2rtc, s6-overlay, etc) FROM slim-base AS deps ARG TARGETARCH ARG DEBIAN_FRONTEND # 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_DRIVER_CAPABILITIES="compute,video,utility" ENV FLASK_ENV="development" ENV PATH="/usr/lib/btbn-ffmpeg/bin:/usr/local/go2rtc/bin:/usr/local/nginx/sbin:${PATH}" # Install dependencies RUN --mount=type=bind,source=docker/install_deps.sh,target=/deps/install_deps.sh \ --mount=type=bind,from=wheels,source=/wheels,target=/deps/wheels \ /deps/install_deps.sh COPY --from=deps-rootfs / / EXPOSE 5000 EXPOSE 1935 EXPOSE 8554 EXPOSE 8555 ENTRYPOINT ["/init"] # Frigate deps with Node.js and NPM FROM deps AS deps-node # Install Node 16 RUN apt-get update \ && apt-get install wget -y \ && wget -qO- https://deb.nodesource.com/setup_16.x | bash - \ && apt-get install -y nodejs \ && rm -rf /var/lib/apt/lists/* \ && npm install -g npm@9 # Devcontainer FROM deps-node AS devcontainer WORKDIR /workspace/frigate RUN apt-get update \ && apt-get install make -y \ && rm -rf /var/lib/apt/lists/* RUN --mount=type=bind,source=./requirements-dev.txt,target=/workspace/frigate/requirements-dev.txt \ pip3 install -r requirements-dev.txt CMD ["sleep", "infinity"] # Frigate web build FROM deps-node AS web-build WORKDIR /work COPY web/package.json web/package-lock.json ./ RUN npm install COPY web/ ./ RUN npm run build # Frigate web dist files FROM scratch AS web-dist COPY --from=web-build /work/dist/ / # Collect final files in a single layer FROM scratch AS rootfs WORKDIR /opt/frigate/ COPY frigate frigate/ COPY migrations migrations/ COPY --from=web-dist / web/ # Frigate final container FROM deps WORKDIR /opt/frigate/ COPY --from=rootfs / / CMD ["python3", "-u", "-m", "frigate"]