# voitrans 业务单镜像:gateway + home + api + mcp + timer 五个集群(RPCX/ETCD)服务打进一个镜像 # 构建上下文:apps/services/ # 用 shell 脚本(entrypoint)管理多进程:任一服务退出即整个容器退出,交给 docker restart 策略拉起。 # 运行期配置 confs/ 由宿主机 deploy/voitrans/ 目录挂入当 /app(见 docker-compose.yml)。 # ============ Stage 1: Builder ============ FROM golang:1.25-alpine AS builder ENV GOPROXY=https://goproxy.cn,direct \ CGO_ENABLED=0 \ GOOS=linux \ GOARCH=amd64 WORKDIR /src # 预热依赖缓存 COPY go.mod go.sum ./ RUN --mount=type=cache,target=/go/pkg/mod \ go mod download COPY . . # 编译 5 个服务(统一 .a11 后缀,与镜像名 voitrans-a11 对齐) RUN --mount=type=cache,target=/go/pkg/mod \ --mount=type=cache,target=/root/.cache/go-build \ mkdir -p /out && \ go build -trimpath -ldflags "-s -w" -o /out/gateway.a11 ./services/gateway/ && \ go build -trimpath -ldflags "-s -w" -o /out/home.a11 ./services/home/ && \ go build -trimpath -ldflags "-s -w" -o /out/api.a11 ./services/api/ && \ go build -trimpath -ldflags "-s -w" -o /out/mcp.a11 ./services/mcp/ && \ go build -trimpath -ldflags "-s -w" -o /out/timer.a11 ./services/timer/ # ============ Stage 2: Runtime ============ FROM alpine:3.20 # nc 用于 compose 健康检查探测端口 RUN apk add --no-cache tzdata ca-certificates && \ cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \ echo "Asia/Shanghai" > /etc/timezone # 二进制与启动脚本放 /opt/voitrans,避免与宿主机挂载的 /app 冲突 COPY --from=builder /out/gateway.a11 /opt/voitrans/a11/gateway.a11 COPY --from=builder /out/home.a11 /opt/voitrans/a11/home.a11 COPY --from=builder /out/api.a11 /opt/voitrans/a11/api.a11 COPY --from=builder /out/mcp.a11 /opt/voitrans/a11/mcp.a11 COPY --from=builder /out/timer.a11 /opt/voitrans/a11/timer.a11 COPY entrypoint.voitrans.sh /opt/voitrans/entrypoint.sh RUN chmod +x /opt/voitrans/entrypoint.sh /opt/voitrans/a11/*.a11 && \ mkdir -p /app # 工作目录:宿主机把 deploy/voitrans 目录挂为 /app,内含 confs/ log/ 及各服务运行期资源 WORKDIR /app # 端口声明(容器内部,对外经反代/compose 暴露) # gateway: 7001 RPCX / 7100 HTTP # home: 7002 RPCX # timer: 7003 RPCX # mcp: 7004 RPCX / 7300 HTTP(MCP) # api: 7005 RPCX / 8080 Console EXPOSE 7001 7002 7003 7004 7005 7100 7300 8080 ENTRYPOINT ["/opt/voitrans/entrypoint.sh"]