# ============================================================================= # AstroResearch Dockerfile — Mode B (进程内 obscura, 无外部二进制依赖) # ============================================================================= # # 前置条件: # mkdir -p libs # git clone https://github.com/h4ckf0r0day/obscura libs/obscura # # 并从 .dockerignore 中移除 "libs/" 行 (否则源码不会进构建上下文) # # 构建: # docker build -f Dockerfile.modeB -t astroresearch-all:latest . # # 运行 (无需 bin/obscura, 反爬能力内置于单体二进制): # docker run -d --name astro -p 8000:8000 --env-file .env \ # -v ./library:/app/library \ # -v ./logs:/app/logs \ # -v ./skills:/app/skills:ro \ # astroresearch-all:latest # # 注意: Mode B 依赖 deno_core → v8 (V8 JavaScript 引擎). # Deno 只发布 glibc 目标的预编译 V8 静态库, 无 musl 版本. # 因此构建和运行都必须使用 glibc (Debian), 不能用 Alpine/musl. # ============================================================================= # ─── Stage 1: 前端 ─────────────────────────────────────────────────────────── FROM node:22-alpine AS frontend-builder ARG USE_MIRRORS=1 WORKDIR /app/dashboard RUN if [ "$USE_MIRRORS" = "1" ]; then \ npm config set registry https://registry.npmmirror.com; \ fi COPY dashboard/package.json dashboard/package-lock.json ./ RUN npm ci COPY dashboard/ ./ RUN npm run build # ─── Stage 2: Rust 后端 (glibc, V8 预编译库仅支持 glibc) ──────────────────── FROM rust:1.94-slim-bookworm AS backend-builder ARG USE_MIRRORS=1 RUN if [ "$USE_MIRRORS" = "1" ]; then \ sed -i 's|deb.debian.org|mirrors.ustc.edu.cn|g' /etc/apt/sources.list.d/debian.sources; \ fi # build-essential: gcc g++ make; binutils: nm objcopy (btls-sys prefix-symbols) # libclang-dev: libclang.so (bindgen FFI 生成, btls-sys + v8) # cmake perl git curl python3: BoringSSL 编译 + V8 下载 # 注: 无需 libssl-dev/libgit2-dev — git2(default-features=false,无https) 不依赖 OpenSSL RUN apt-get update && apt-get install -y --no-install-recommends \ build-essential binutils cmake pkg-config libclang-dev \ perl git curl python3 ca-certificates \ && rm -rf /var/lib/apt/lists/* # bindgen 需要找到 libclang.so; Debian bookworm 安装在 /usr/lib/llvm-14/lib/ ENV LIBCLANG_PATH=/usr/lib/llvm-14/lib ENV SKIP_DASHBOARD_BUILD=1 WORKDIR /app COPY Cargo.toml Cargo.lock build.rs ./ COPY src/ ./src/ COPY migrations/ ./migrations/ COPY libs/obscura/ ./libs/obscura/ COPY --from=frontend-builder /app/dashboard/dist/ ./dashboard/dist/ RUN cargo build --profile release-min --features obscura-inprocess && \ cp /app/target/release-min/astroresearch /usr/local/bin/astroresearch # ─── Stage 3: 运行时 (distroless — 仅 glibc + 必需库, 无 shell/apt) ────── FROM gcr.io/distroless/cc-debian12:nonroot # frontend + skills + migrations 从构建阶段拷贝 COPY --from=frontend-builder /app/dashboard/dist/ /app/dashboard/dist/ COPY skills/ /app/skills/ COPY migrations/ /app/migrations/ # 二进制 COPY --from=backend-builder /usr/local/bin/astroresearch /app/astroresearch WORKDIR /app VOLUME ["/app/library", "/app/logs", "/app/skills"] EXPOSE 8000 # 注: distroless 无 shell/wget, 无法使用传统 healthcheck. # 编排层 (docker-compose/k8s) 可用 TCP probe 或 HTTP GET / 替代. ENTRYPOINT ["/app/astroresearch"]