# ==================== 阶段 1:构建前端 SPA ==================== FROM node:20-alpine AS ui WORKDIR /ui COPY ui-src/package.json ui-src/package-lock.json ./ RUN npm ci COPY ui-src/ ./ RUN npm run build # ==================== 阶段 2:构建后端二进制(modernc sqlite 纯 Go,无 CGO) ==================== FROM golang:1.26 AS build WORKDIR /app COPY go.mod go.sum ./ RUN go mod download COPY . . RUN CGO_ENABLED=0 go build -ldflags="-s -w" -o rag-local . # ==================== 阶段 3:精简运行镜像 ==================== FROM alpine:3.20 WORKDIR /app RUN apk add --no-cache tzdata && \ adduser -D -u 1000 app && \ mkdir -p /app/data /app/workspace && \ chown -R app:app /app ENV TZ=Asia/Shanghai COPY --from=build /app/rag-local /app/rag-local COPY --from=build /app/config.yml /app/config.yml COPY --from=ui /ui/dist /app/ui-src/dist USER app EXPOSE 8080 VOLUME ["/app/data", "/app/workspace"] ENTRYPOINT ["/app/rag-local"]