# 视野后端构建:多阶段编译 → 精简运行镜像(纯 Go + SQLite,无 CGO 依赖) # 基础镜像仓库:国内直连 docker.io 不通,默认走 DaoCloud 镜像站;构建时可用 --build-arg REGISTRY=docker.io/library 覆盖 ARG REGISTRY=docker.m.daocloud.io/library FROM ${REGISTRY}/golang:1.26 AS builder # 国内网络 proxy.golang.org 不通,默认走 goproxy.cn;构建时可用 --build-arg 覆盖 ARG GOPROXY=https://goproxy.cn,direct ENV GOPROXY=${GOPROXY} WORKDIR /build # 依赖层缓存:go.mod/go.sum 变更才重拉依赖 COPY go.mod go.sum ./ # 清空 buildkit 注入的宿主代理(Docker Desktop 全局代理 127.0.0.1:7892 在容器内不通, # proxyconnect connection refused);依赖直连 goproxy.cn 拉取,后续 go build 离线无需网络 RUN http_proxy= https_proxy= HTTP_PROXY= HTTPS_PROXY= go mod download COPY . . RUN CGO_ENABLED=0 go build -o /out/observer-server . ARG REGISTRY=docker.m.daocloud.io/library FROM ${REGISTRY}/alpine:3.20 # 国内网络 dl-cdn.alpinelinux.org 不通,默认走阿里云镜像;构建时可用 --build-arg 覆盖 ARG APK_MIRROR=https://mirrors.aliyun.com # 时区对齐宿主(自然日授权语义依赖本地时区) # apk 走 http_proxy 环境变量:清空 buildkit 注入的宿主代理(同上方 go mod download,容器内代理不通) RUN sed -i "s#https://dl-cdn.alpinelinux.org#${APK_MIRROR}#g" /etc/apk/repositories && \ http_proxy= https_proxy= HTTP_PROXY= HTTPS_PROXY= apk add --no-cache tzdata && \ cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \ echo "Asia/Shanghai" > /etc/timezone WORKDIR /app COPY --from=builder /out/observer-server /app/observer-server COPY config.yml /app/config.yml # 管理端静态产物(server_admin 构建输出),由 /admin 路径托管 COPY --from=builder /build/admin_dist /app/admin_dist # APK 下载引导页(源码目录 h5/),由 /download-page 路径托管 COPY --from=builder /build/h5 /app/h5 # 运行时数据目录(SQLite 库),由 docker-compose 挂载持久化 RUN mkdir -p /app/data EXPOSE 8080 ENTRYPOINT ["/app/observer-server"]