110 lines
4.9 KiB
Docker
110 lines
4.9 KiB
Docker
ARG BASE_IMAGE=ubuntu:24.04
|
|
# BUILDER_BASE_IMAGE defaults to BASE_IMAGE so the Dockerfile parses when no
|
|
# prebuilt base is supplied; the builder-prebuilt stage is only entered when
|
|
# BUILDER_TARGET=builder-prebuilt, so the fallback content is harmless
|
|
# (BuildKit prunes the unreferenced builder).
|
|
ARG BUILDER_BASE_IMAGE=${BASE_IMAGE}
|
|
# BUILDER_TARGET selects which builder stage the scratch image copies from.
|
|
# Declared before any FROM so it is usable in `FROM ${BUILDER_TARGET}`. The
|
|
# backend_build workflow sets it to builder-prebuilt when the matrix entry
|
|
# provides builder-base-image, else builder-fromsource (the local default).
|
|
ARG BUILDER_TARGET=builder-fromsource
|
|
ARG APT_MIRROR=""
|
|
ARG APT_PORTS_MIRROR=""
|
|
|
|
# privacy-filter: standalone GGML engine for the openai-privacy-filter PII/NER
|
|
# token classifier, wrapped as a LocalAI gRPC backend.
|
|
#
|
|
# Mirrors backend/Dockerfile.llama-cpp: the build toolchain (gRPC + cmake +
|
|
# protoc + conditional CUDA/Vulkan) comes from the shared
|
|
# .docker/install-base-deps.sh (from-source path) or a prebuilt
|
|
# quay.io/go-skynet/ci-cache:base-grpc-* image (CI path) — nothing GPU-specific
|
|
# is hand-rolled here. BUILD_TYPE selects the engine backend in the Makefile:
|
|
# "" = cpu, "cublas" -> -DPF_CUDA=ON, "vulkan" -> -DPF_VULKAN=ON.
|
|
|
|
# ============================================================================
|
|
# Stage: builder-fromsource — self-contained build. Runs the same install
|
|
# script backend/Dockerfile.base-grpc-builder runs, so this path is
|
|
# bit-equivalent to the prebuilt base. Used when BUILDER_TARGET=builder-fromsource
|
|
# (the default; local `make backends/privacy-filter`).
|
|
# ============================================================================
|
|
FROM ${BASE_IMAGE} AS builder-fromsource
|
|
ARG BUILD_TYPE
|
|
ARG CUDA_MAJOR_VERSION
|
|
ARG CUDA_MINOR_VERSION
|
|
ARG CMAKE_FROM_SOURCE=false
|
|
# CUDA Toolkit 13.x needs CMake 3.31.9+ for correct toolchain/arch detection.
|
|
ARG CMAKE_VERSION=3.31.10
|
|
ARG GRPC_VERSION=v1.65.0
|
|
ARG GRPC_MAKEFLAGS="-j4 -Otarget"
|
|
ARG SKIP_DRIVERS=false
|
|
ARG TARGETARCH
|
|
ARG UBUNTU_VERSION=2404
|
|
ARG APT_MIRROR
|
|
ARG APT_PORTS_MIRROR
|
|
|
|
ENV BUILD_TYPE=${BUILD_TYPE} \
|
|
CUDA_MAJOR_VERSION=${CUDA_MAJOR_VERSION} \
|
|
CUDA_MINOR_VERSION=${CUDA_MINOR_VERSION} \
|
|
CMAKE_FROM_SOURCE=${CMAKE_FROM_SOURCE} \
|
|
CMAKE_VERSION=${CMAKE_VERSION} \
|
|
GRPC_VERSION=${GRPC_VERSION} \
|
|
GRPC_MAKEFLAGS=${GRPC_MAKEFLAGS} \
|
|
SKIP_DRIVERS=${SKIP_DRIVERS} \
|
|
TARGETARCH=${TARGETARCH} \
|
|
UBUNTU_VERSION=${UBUNTU_VERSION} \
|
|
APT_MIRROR=${APT_MIRROR} \
|
|
APT_PORTS_MIRROR=${APT_PORTS_MIRROR} \
|
|
DEBIAN_FRONTEND=noninteractive
|
|
# CUDA on PATH (a no-op when CUDA is not installed, e.g. cpu/vulkan builds).
|
|
ENV PATH=/usr/local/cuda/bin:${PATH}
|
|
|
|
WORKDIR /build
|
|
|
|
# apt deps + cmake + protoc + gRPC + conditional CUDA/Vulkan, all from the
|
|
# shared script (the source of truth that base-grpc-builder also runs).
|
|
RUN --mount=type=bind,source=.docker/install-base-deps.sh,target=/usr/local/sbin/install-base-deps \
|
|
--mount=type=bind,source=.docker/apt-mirror.sh,target=/usr/local/sbin/apt-mirror \
|
|
bash /usr/local/sbin/install-base-deps
|
|
|
|
# install-base-deps installs gRPC under /opt/grpc; copy it to /usr/local so the
|
|
# backend's find_package(gRPC CONFIG) resolves it at the canonical prefix.
|
|
RUN cp -a /opt/grpc/. /usr/local/
|
|
|
|
COPY . /LocalAI
|
|
|
|
RUN --mount=type=cache,target=/root/.ccache,id=privacy-filter-ccache-${TARGETARCH}-${BUILD_TYPE},sharing=locked \
|
|
make -C /LocalAI/backend/cpp/privacy-filter BUILD_TYPE=${BUILD_TYPE} NATIVE=false grpc-server package
|
|
|
|
# ============================================================================
|
|
# Stage: builder-prebuilt — FROM a prebuilt
|
|
# quay.io/go-skynet/ci-cache:base-grpc-* image (gRPC at /opt/grpc + apt deps +
|
|
# CUDA/Vulkan already installed). Used in CI when the matrix entry sets
|
|
# builder-base-image.
|
|
# ============================================================================
|
|
FROM ${BUILDER_BASE_IMAGE} AS builder-prebuilt
|
|
ARG BUILD_TYPE
|
|
ARG TARGETARCH
|
|
ENV BUILD_TYPE=${BUILD_TYPE}
|
|
# CUDA on PATH (a no-op for the cpu/vulkan base images).
|
|
ENV PATH=/usr/local/cuda/bin:${PATH}
|
|
|
|
# Mirror builder-fromsource: the base-grpc image installs gRPC to /opt/grpc but
|
|
# does not copy it to /usr/local.
|
|
RUN cp -a /opt/grpc/. /usr/local/
|
|
|
|
COPY . /LocalAI
|
|
|
|
RUN --mount=type=cache,target=/root/.ccache,id=privacy-filter-ccache-${TARGETARCH}-${BUILD_TYPE},sharing=locked \
|
|
make -C /LocalAI/backend/cpp/privacy-filter BUILD_TYPE=${BUILD_TYPE} NATIVE=false grpc-server package
|
|
|
|
# ============================================================================
|
|
# Final stage — copy the package output from the selected builder. BuildKit
|
|
# does not expand variables in `COPY --from=`, so alias the chosen builder to a
|
|
# fixed stage name first.
|
|
# ============================================================================
|
|
FROM ${BUILDER_TARGET} AS builder
|
|
|
|
FROM scratch
|
|
COPY --from=builder /LocalAI/backend/cpp/privacy-filter/package/. ./
|