File size: 2,506 Bytes
b915662 c17d19d b915662 c17d19d b915662 c17d19d b915662 c17d19d b915662 1cc312a 14cd211 208a803 14cd211 208a803 7ec05e9 c17d19d 14cd211 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
# ---------- 0) 拉取源码 ----------
FROM alpine:3.20 AS src
RUN apk add --no-cache git
ARG REPO_URL=https://github.com/tbphp/gpt-load.git
# 如需可复现构建,可把 main 改为固定 tag 或 commit
ARG REPO_REF=main
WORKDIR /src
# 为了能获取到全部 tag,这里不做浅克隆
RUN git clone --branch "${REPO_REF}" "${REPO_URL}" . \
&& git fetch --tags --force || true \
# 取最新语义化 tag(如 v1.3.1),没有 tag 就用短 commit
&& LATEST_TAG="$(git tag -l --sort=-v:refname | head -n1)" \
&& if [ -n "$LATEST_TAG" ]; then VERSION="${LATEST_TAG#v}"; else VERSION="$(git rev-parse --short HEAD)"; fi \
&& printf "%s" "$VERSION" > /version.txt
# ---------- 1) 构建前端 ----------
FROM node:20-alpine3.20 AS web-builder
WORKDIR /build/web
# 利用缓存:先依赖清单后源码
COPY --from=src /src/web/package*.json ./
RUN npm ci
COPY --from=src /src/web ./
# 从 src 阶段带入版本号文件
COPY --from=src /version.txt ./VERSION
# Vite 只认编译期变量的 VITE_ 前缀:用一次性环境变量注入
RUN VITE_VERSION="$(cat VERSION)" npm run build
# ---------- 2) 构建后端(Go 1.23) ----------
FROM golang:1.23-alpine3.20 AS go-builder
ENV GO111MODULE=on \
CGO_ENABLED=0 \
GOOS=linux \
GOTOOLCHAIN=auto
WORKDIR /build
# 先缓存依赖
COPY --from=src /src/go.mod ./
COPY --from=src /src/go.sum ./
RUN go mod download
# 复制全部后端源码
COPY --from=src /src ./
# 注入前端产物
COPY --from=web-builder /build/web/dist ./web/dist
# 带入版本号
COPY --from=src /version.txt ./VERSION
# 更小二进制 + 正确注入版本(自动读取模块名)
RUN MODULE="$(grep ^module go.mod | awk '{print $2}')" \
&& VERSION="$(cat VERSION)" \
&& echo ">> building ${MODULE} version=${VERSION}" \
&& go build -trimpath \
-ldflags "-s -w -X ${MODULE}/internal/version.Version=${VERSION}" \
-o gpt-load .
# ---------- 3) 运行阶段 ----------
FROM alpine:3.20
WORKDIR /app
RUN apk add --no-cache ca-certificates tzdata && update-ca-certificates
COPY --from=go-builder /build/gpt-load /app/gpt-load
COPY ./run.sh /app/run.sh
RUN chmod +x /app/run.sh
# 关键权限:root 组可写,适配 HF 的 gid=0 运行方式
RUN mkdir -p /app/data \
&& chgrp -R 0 /app \
&& chmod -R g+rwX /app
ENV DATABASE_DRIVER=sqlite
ENV DATABASE_DSN=/app/data/gpt-load.db
# Hugging Face Spaces 会注入 PORT;这里保留默认值以便本地运行
ENV PORT=7860
EXPOSE 7860
ENTRYPOINT ["/app/run.sh"] |