mirror of
https://github.com/scottlamb/moonfire-nvr.git
synced 2024-12-26 23:25:55 -05:00
dd66c7b0dd
Besides being more clear about what belongs to which, this helps with docker caching. The server and ui parts are only rebuilt when their respective subdirectories change. Extend this a bit further by making the webpack build not depend on the target architecture. And adding cache dirs so parts of the server and ui build process can be reused when layer-wide caching fails.
75 lines
2.7 KiB
Docker
75 lines
2.7 KiB
Docker
# syntax=docker/dockerfile:1.2.1
|
|
|
|
# See documentation here:
|
|
# https://github.com/moby/buildkit/blob/master/frontend/dockerfile/docs/syntax.md
|
|
|
|
# "dev-common" is the portion of "dev" (see below) which isn't specific to the
|
|
# target arch. It's sufficient for building the non-arch-specific webpack.
|
|
FROM --platform=$BUILDPLATFORM ubuntu:20.04 AS dev-common
|
|
LABEL maintainer="slamb@slamb.org"
|
|
ARG BUILD_UID=1000
|
|
ARG BUILD_GID=1000
|
|
ENV LC_ALL=C.UTF-8
|
|
COPY docker/dev-common.bash /
|
|
RUN /dev-common.bash
|
|
CMD [ "/bin/bash", "--login" ]
|
|
|
|
# "dev" is a full development environment, suitable for shelling into or
|
|
# using with the VS Code container plugin.
|
|
FROM --platform=$BUILDPLATFORM dev-common AS dev
|
|
ARG BUILDARCH
|
|
ARG TARGETARCH
|
|
LABEL maintainer="slamb@slamb.org"
|
|
COPY docker/dev.bash /
|
|
RUN /dev.bash
|
|
USER moonfire-nvr:moonfire-nvr
|
|
WORKDIR /var/lib/moonfire-nvr
|
|
|
|
# Build the UI with node_modules and ui-dist outside the src dir.
|
|
FROM --platform=$BUILDPLATFORM dev-common AS build-ui
|
|
LABEL maintainer="slamb@slamb.org"
|
|
WORKDIR /var/lib/moonfire-nvr/src/ui
|
|
COPY ui /var/lib/moonfire-nvr/src/ui
|
|
RUN --mount=type=cache,target=/var/lib/moonfire-nvr/src/ui/node_modules,sharing=locked,mode=1777 \
|
|
yarn install && yarn build
|
|
|
|
# Build the Rust components. Note that dev.sh set up an environment variable
|
|
# in .buildrc that similarly changes the target dir path.
|
|
FROM --platform=$BUILDPLATFORM dev AS build-server
|
|
LABEL maintainer="slamb@slamb.org"
|
|
RUN --mount=type=cache,id=target,target=/var/lib/moonfire-nvr/target,sharing=locked,mode=1777 \
|
|
--mount=type=bind,source=server,target=/var/lib/moonfire-nvr/src/server,readonly \
|
|
bash -c 'set -o xtrace && \
|
|
source ~/.buildrc && \
|
|
cd src/server && \
|
|
cargo test && \
|
|
cargo build --release && \
|
|
sudo install -m 755 ~/moonfire-nvr /usr/local/bin/moonfire-nvr'
|
|
|
|
# Deployment environment, now in the target platform.
|
|
FROM --platform=$TARGETPLATFORM ubuntu:20.04 AS deploy
|
|
LABEL maintainer="slamb@slamb.org"
|
|
ENV LC_ALL=C.UTF-8
|
|
RUN export DEBIAN_FRONTEND=noninteractive && \
|
|
apt-get update && \
|
|
apt-get install --assume-yes --no-install-recommends \
|
|
ffmpeg \
|
|
libncurses6 \
|
|
libncursesw6 \
|
|
locales \
|
|
sudo \
|
|
sqlite3 \
|
|
tzdata \
|
|
vim-nox && \
|
|
apt-get clean && \
|
|
rm -rf /var/lib/apt/lists/* && \
|
|
ln -s moonfire-nvr /usr/local/bin/nvr
|
|
COPY --from=build-server /usr/local/bin/moonfire-nvr /usr/local/bin/moonfire-nvr
|
|
COPY --from=build-ui /var/lib/moonfire-nvr/ui/dist /usr/local/lib/moonfire-nvr/ui
|
|
|
|
# The install instructions say to use --user in the docker run commandline.
|
|
# Specify a non-root user just in case someone forgets.
|
|
USER 10000:10000
|
|
WORKDIR /var/lib/moonfire-nvr
|
|
ENTRYPOINT [ "/usr/local/bin/moonfire-nvr" ]
|