62 lines
1.8 KiB
Docker
62 lines
1.8 KiB
Docker
# ============================================================
|
||
# 多阶段构建
|
||
# ============================================================
|
||
|
||
# ---------- 构建阶段 ----------
|
||
FROM golang:alpine AS builder
|
||
|
||
WORKDIR /app
|
||
|
||
# 复制依赖文件(兼容 go.sum 可能不存在的情况)
|
||
COPY go.mod go.sum* ./
|
||
|
||
# 修复 go.mod 版本过高问题(frpc 用 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"] |