用多阶段构建把 Nuxt 静态产物交给 nginx 托管,对外暴露 2229 端口。 nginx 配置覆盖 SPA 路由回退与静态资源缓存策略,构建上下文用 .dockerignore 排除依赖与产物。
46 lines
1.5 KiB
Docker
46 lines
1.5 KiB
Docker
# ---------- 构建阶段 ----------
|
||
FROM node:24-alpine AS builder
|
||
|
||
# pnpm 版本与 package.json 的 packageManager 字段保持一致
|
||
RUN npm install -g pnpm@11.21.0
|
||
|
||
WORKDIR /app
|
||
|
||
# 构建期关闭遥上报,避免容器构建时产生外部请求
|
||
ENV NUXT_TELEMETRY_DISABLED=1
|
||
|
||
# 先只复制依赖清单,让 pnpm install 这一层可以被缓存复用
|
||
COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./
|
||
COPY apps/web/package.json apps/web/package.json
|
||
COPY packages/cook/package.json packages/cook/package.json
|
||
COPY docs/package.json docs/package.json
|
||
|
||
RUN pnpm install --frozen-lockfile
|
||
|
||
# 再复制源码并构建
|
||
COPY . .
|
||
|
||
# 统计配置在构建期编译进静态产物
|
||
ARG NUXT_PUBLIC_CLARITY_PROJECT_ID=ks1ebw03i5
|
||
ARG NUXT_PUBLIC_CLARITY_DOMAINS=cook.yunyoujun.cn,cook.yunle.fun
|
||
ENV NUXT_PUBLIC_CLARITY_PROJECT_ID=${NUXT_PUBLIC_CLARITY_PROJECT_ID}
|
||
ENV NUXT_PUBLIC_CLARITY_DOMAINS=${NUXT_PUBLIC_CLARITY_DOMAINS}
|
||
|
||
# 镜像里没有 .git,版本号组件拿不到 commit;传入该值即可显示版本信息
|
||
ARG CF_PAGES_COMMIT_SHA=
|
||
ENV CF_PAGES_COMMIT_SHA=${CF_PAGES_COMMIT_SHA}
|
||
|
||
# 构建产物输出到仓库根目录的 dist/(见 scripts/copy-web-output.ts)
|
||
RUN pnpm run build
|
||
|
||
# ---------- 运行阶段 ----------
|
||
FROM nginx:stable-alpine
|
||
|
||
COPY docker/nginx.conf /etc/nginx/conf.d/default.conf
|
||
COPY --from=builder /app/dist /usr/share/nginx/html
|
||
|
||
EXPOSE 2229
|
||
|
||
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
|
||
CMD wget -qO- http://127.0.0.1:2229/ >/dev/null || exit 1
|