# syntax=docker/dockerfile:1.7 # # cdrop:latest —— 应用镜像。基础环境(Go 工具链 + node_modules + go modules) # 已被 cdrop-base:latest 预热(见 docker/Dockerfile.base),这里只做源码层与 # 跨编译。 # # 构建(部署平台为 linux/amd64): # docker buildx build --platform linux/amd64 \ # -f docker/Dockerfile -t cdrop:latest --load . # # BUILDPLATFORM 让 build 阶段跑在宿主原生 arch(macOS arm64),跨编译产出 # linux/amd64 的 Go 二进制;最终 runtime FROM distroless 是 linux/amd64 # 但只有 COPY 一层,不经过 qemu 执行任何 amd64 程序。 # ---- build (uses cached base) ---- FROM --platform=$BUILDPLATFORM cdrop-base:latest AS build ARG TARGETOS=linux TARGETARCH=amd64 # Vite 编译期 env:dev 模式 token 必须随 image 烤进 bundle;prod 部署留空即可 ARG VITE_CDROP_DEV_TOKEN="" ARG VITE_CDROP_STUN_URLS="" ENV VITE_CDROP_DEV_TOKEN=$VITE_CDROP_DEV_TOKEN \ VITE_CDROP_STUN_URLS=$VITE_CDROP_STUN_URLS WORKDIR /src # 复制源码(依赖在 base 中已就位) COPY . . # 前端构建(VITE_* 环境变量已 export) RUN cd web && npm run build # 嵌入到 internal/webui/dist 让 //go:embed 拿到 RUN rm -rf ./internal/webui/dist && cp -a web/dist ./internal/webui/dist # 跨编译 Go 到目标平台 RUN GOOS=$TARGETOS GOARCH=$TARGETARCH CGO_ENABLED=0 \ go build -trimpath -ldflags="-s -w" -o /out/cdropd ./cmd/cdropd # ---- runtime (linux/amd64 distroless) ---- FROM gcr.io/distroless/static-debian12:nonroot COPY --from=build /out/cdropd /cdropd USER nonroot:nonroot EXPOSE 8080 ENTRYPOINT ["/cdropd"]