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