# ---- 构建阶段 ---- FROM golang:1.26-alpine AS build WORKDIR /src # 国内构建默认走 goproxy.cn:服务器上没有本地模块缓存,直连 proxy.golang.org 常常超时。 # 换环境时用 --build-arg GOPROXY=https://proxy.golang.org,direct 覆盖。 ARG GOPROXY=https://goproxy.cn,direct ENV GOPROXY=$GOPROXY # 先拉依赖,利用层缓存(改业务代码时不会重复下载模块) COPY go.mod go.sum ./ RUN go mod download COPY . . # -trimpath 去掉构建机的绝对路径;-s -w 去掉符号表与调试信息(约 50MB -> 32MB) RUN CGO_ENABLED=0 GOOS=linux go build -trimpath -ldflags "-s -w" -o /out/server ./cmd/server # ---- 运行阶段 ---- FROM alpine:3.20 RUN apk add --no-cache ca-certificates tzdata WORKDIR /app COPY --from=build /out/server /app/server # 模板与后台静态资源已用 go:embed 打进二进制,这里只需要配置 COPY configs ./configs # 本地存储兜底目录:启用 S4 时图片在对象存储,此目录只承接临时/兜底文件 RUN mkdir -p /app/uploads ENV CONFIG_PATH=/app/configs/config.yml \ GIN_MODE=release \ UPLOAD_DIR=/app/uploads # 三个端口的暴露面(详见 README): # 8090 公开 API(生产由前端 nginx 同源反代) # 8091 SSG 构建期内部接口(只绑回环,绝不对外) # 8092 管理后台(只绑回环) EXPOSE 8090 8091 8092 # busybox 自带 wget,无需额外安装 HEALTHCHECK --interval=30s --timeout=5s --start-period=20s --retries=3 \ CMD wget -qO- http://127.0.0.1:8090/api/health || exit 1 CMD ["/app/server"]