Files
dujiao-next/Dockerfile
T

73 lines
2.7 KiB
Docker

# syntax=docker/dockerfile:1
#
# 单镜像全栈构建:admin + user 两个 SPA 编译后由 go:embed 打进同一个二进制,
# 由同一个进程在同一端口(8080)提供服务。不再需要独立的前端容器与 nginx。
# ---- 阶段 1:构建两个前端 ----
# 固定在构建机原生架构上跑(前端产物与目标架构无关),避免 buildx 多平台构建时
# 在 QEMU 模拟的 arm64 下重跑一遍 Node —— 那样构建耗时会差一个数量级。
FROM --platform=$BUILDPLATFORM node:24.11.1-alpine AS frontend
WORKDIR /src
ENV COREPACK_ENABLE_DOWNLOAD_PROMPT=0
RUN corepack enable
# 先只拷 manifest,让依赖安装层能在源码变动时命中缓存
COPY frontend/admin/package.json frontend/admin/pnpm-lock.yaml ./admin/
COPY frontend/user/package.json frontend/user/pnpm-lock.yaml ./user/
RUN cd admin && pnpm install --frozen-lockfile
RUN cd user && pnpm install --frozen-lockfile
COPY frontend/admin ./admin
COPY frontend/user ./user
# admin 走 fullstack 模式:注入 __DJ_ADMIN_BASE__ 占位符,
# 后端启动时按 web.admin_path 替换,使同一份产物能挂到任意自定义前缀。
RUN cd admin && pnpm run build:fullstack
RUN cd user && pnpm run build
# ---- 阶段 2:构建内嵌前端的 Go 二进制 ----
# 版本必须 >= go.mod 的 go 指令,官方镜像默认 GOTOOLCHAIN=local 不会自动拉取更高工具链。
FROM --platform=$BUILDPLATFORM golang:1.26.5-alpine AS builder
ARG TARGETOS
ARG TARGETARCH
ARG TARGETVARIANT
ARG APP_VERSION=v1.0.0
RUN echo "Building for $TARGETOS/$TARGETARCH$TARGETVARIANT"
WORKDIR /src
ENV CGO_ENABLED=0
COPY go.mod go.sum ./
RUN go mod download
COPY . .
# go:embed 只能读取包目录内的文件,所以前端产物必须落到 internal/web/dist/ 下
COPY --from=frontend /src/admin/dist ./internal/web/dist/admin
COPY --from=frontend /src/user/dist ./internal/web/dist/user
RUN set -eux; \
export GOOS="$TARGETOS" GOARCH="$TARGETARCH"; \
if [ "$TARGETARCH" = "arm" ] && [ -n "$TARGETVARIANT" ]; then export GOARM="${TARGETVARIANT#v}"; fi; \
if [ "$TARGETARCH" = "amd64" ] && [ -n "$TARGETVARIANT" ]; then export GOAMD64="${TARGETVARIANT#v}"; fi; \
go build -trimpath -tags release,fullstack -ldflags="-s -w -X github.com/dujiao-next/internal/version.Version=${APP_VERSION} -X github.com/dujiao-next/internal/version.BuildType=release" -o /out/dujiao-next ./cmd/server
# ---- 阶段 3:运行时 ----
FROM alpine:latest
WORKDIR /app
RUN apk --no-cache add ca-certificates tzdata \
&& mkdir -p /app/db /app/uploads /app/logs
COPY --from=builder /out/dujiao-next /app/dujiao-next
COPY config.yml.example /app/config.yml.example
EXPOSE 8080
CMD ["./dujiao-next"]