73 lines
2.7 KiB
Docker
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"]
|