| |
| FROM alpine:3.20 AS src |
| RUN apk add --no-cache git |
| ARG REPO_URL=https://github.com/tbphp/gpt-load.git |
| |
| ARG REPO_REF=main |
| WORKDIR /src |
| |
| 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 |
|
|
| |
| 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 ./ |
|
|
| |
| COPY --from=src /version.txt ./VERSION |
|
|
| |
| RUN VITE_VERSION="$(cat VERSION)" npm run build |
|
|
| |
| 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 . |
|
|
| |
| 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 |
|
|
| |
| 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 |
| |
| ENV PORT=7860 |
| EXPOSE 7860 |
|
|
| ENTRYPOINT ["/app/run.sh"] |