From cd19034e80a64d9141f6bdc41ca49b8fb4d22834 Mon Sep 17 00:00:00 2001 From: estel <690930@qq.com> Date: Tue, 29 Jul 2025 00:04:29 +0800 Subject: [PATCH] =?UTF-8?q?=E5=86=8D=E6=AC=A1=E5=B0=9D=E8=AF=95=E4=BF=AE?= =?UTF-8?q?=E6=94=B9dockerfile?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Dockerfile | 61 ++++++++++++++++++++++-------------------------------- 1 file changed, 25 insertions(+), 36 deletions(-) diff --git a/Dockerfile b/Dockerfile index 9efff44..c0e6573 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,56 +1,45 @@ -# 使用Node.js 20作为基础镜像 +########## stage 1:deps + build ########## FROM node:20-alpine AS base -# 安装pnpm和必要的工具 -RUN npm install -g pnpm +# 0. 先放系统包 +RUN apk add --no-cache \ + build-base \ + python3 \ + sqlite-dev # better-sqlite3 头文件、库 + +# 1. 装好 pnpm +RUN corepack enable && corepack prepare pnpm@latest --activate -# 设置工作目录 WORKDIR /app -# 复制package.json和pnpm-lock.yaml +# 2. 复制锁文件,使用 layer cache COPY package.json pnpm-lock.yaml ./ +RUN --mount=type=cache,id=pnpm,target=/root/.local/share/pnpm/store \ + pnpm install --frozen-lockfile --shamefully-hoist -# 安装依赖 -RUN pnpm install --frozen-lockfile - -# 复制源代码 +# 3. 复制剩余源码并打补丁 COPY . . - -# 运行patch-ui-pro.zsh脚本 RUN chmod +x patch-ui-pro.zsh && ./patch-ui-pro.zsh -# 构建阶段 -FROM base AS builder - -# 构建应用 +# 4. build RUN pnpm build -# 生产阶段 +########## stage 2:运行时 ########## FROM node:20-alpine AS production +# 不需要任何 dev 编译依赖 +RUN apk add --no-cache sqlite-libs # better-sqlite3 运行时库 -# 安装pnpm -RUN npm install -g pnpm - -# 设置工作目录 +RUN corepack enable && corepack prepare pnpm@latest --activate WORKDIR /app -# 复制package.json和pnpm-lock.yaml +# 只装 prod 依赖 COPY package.json pnpm-lock.yaml ./ +RUN --mount=type=cache,id=pnpm,target=/root/.local/share/pnpm/store \ + pnpm install --prod --frozen-lockfile --shamefully-hoist -# 只安装生产依赖 -RUN pnpm install --frozen-lockfile --prod +# 拷构建产物 +COPY --from=base /app/.output /app/.output -# 从构建阶段复制构建产物 -COPY --from=builder /app/.nuxt ./.nuxt -COPY --from=builder /app/.output ./.output - -# 暴露端口 EXPOSE 3000 - -# 设置环境变量 -ENV NODE_ENV=production -ENV HOST=0.0.0.0 -ENV PORT=3000 - -# 启动应用 -CMD ["node", ".output/server/index.mjs"] \ No newline at end of file +ENV NODE_ENV=production HOST=0.0.0.0 PORT=3000 +CMD ["node", ".output/server/index.mjs"]