# ============================================================ # 多阶段构建 # ============================================================ # ---------- 构建阶段 ---------- FROM golang:alpine AS builder WORKDIR /app # 复制依赖文件(兼容 go.sum 可能不存在的情况) COPY go.mod go.sum* ./ # 修复 go.mod 版本过高问题(frps 用 1.26.5,容器内 go 版本可能较低) # 将 go 1.2x 降级为 go 1.21,确保兼容性 RUN sed -i 's/go 1.2[6-9].*/go 1.21/' go.mod && go mod tidy 2>/dev/null || true # 设置 Go 代理(国内加速) RUN go env -w GOPROXY=https://goproxy.cn,direct # 下载依赖 RUN go mod download # 复制全部源码(包含 bin/ 和 static/) COPY . . # 静态编译 Linux 版本 # -p 1 降低并发编译内存峰值(适合低配机器) # -s -w 去除调试信息,减小二进制体积 RUN CGO_ENABLED=0 GOOS=linux go build -p 1 -ldflags="-s -w" -o frps-console . # ---------- 运行阶段 ---------- FROM alpine:latest # 安装必要工具 # - ca-certificates: HTTPS 请求(frps 需要调用 Dashboard API) # - tzdata: 时区支持 # - sqlite: 用于 deploy.sh 中检查数据库状态 RUN apk --no-cache add ca-certificates tzdata sqlite WORKDIR /app # 从构建阶段复制编译好的二进制 COPY --from=builder /app/frps-console /app/frps-console # 复制前端静态文件(从构建阶段) COPY --from=builder /app/static/ /app/static/ # 创建数据目录(用于持久化 db、配置、日志、pid) RUN mkdir -p /app/data # 暴露端口(与 deploy.sh 中 DEFAULT_PORT 保持一致) EXPOSE 9365 # 环境变量(可被 docker run -e 覆盖) ENV PORT=9365 ENV TZ=Asia/Shanghai # 数据卷(持久化数据库、配置、日志) VOLUME ["/app/data"] # 启动(使用 exec 确保信号正确传递) ENTRYPOINT ["/app/frps-console"]