From fb116de7c8e8053e69ea6b4192f1a4b0f1f2d88b Mon Sep 17 00:00:00 2001 From: Jerry Yan <792602257@qq.com> Date: Wed, 29 Apr 2026 10:46:09 +0800 Subject: [PATCH] feat(deploy): multi-stage Dockerfile (web build -> go embed -> alpine runtime) --- Dockerfile | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 Dockerfile diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..ee12a0c --- /dev/null +++ b/Dockerfile @@ -0,0 +1,30 @@ +# syntax=docker/dockerfile:1.7 + +# ─── Stage 1: web build ─── +FROM node:22-alpine AS web +WORKDIR /web +COPY web/package.json web/pnpm-lock.yaml* ./ +RUN corepack enable && (pnpm install --frozen-lockfile || pnpm install) +COPY web . +RUN pnpm build + +# ─── Stage 2: go build ─── +FROM golang:1.25-alpine AS go +WORKDIR /src +RUN apk add --no-cache git +COPY go.mod go.sum ./ +RUN go mod download +COPY . . +COPY --from=web /web/dist/. ./cmd/server/web/dist/ +RUN CGO_ENABLED=0 GOOS=linux go build -trimpath -ldflags='-s -w' -o /out/server ./cmd/server + +# ─── Stage 3: runtime ─── +FROM alpine:3.20 +RUN apk add --no-cache ca-certificates tzdata && \ + addgroup -S app && adduser -S app -G app +WORKDIR /app +COPY --from=go /out/server /app/server +COPY migrations /app/migrations +USER app +EXPOSE 8080 +ENTRYPOINT ["/app/server"]