# 支持: linux/amd64, linux/arm64, linux/arm/v7 # ========== 支持在 CI 注入国内镜像源前缀拉 node 基础镜像 ========== # 用法:docker buildx build \ # --build-arg DOCKER_MIRROR=docker.m.daocloud.io/library/ \ # --build-arg NODE_BUILDER_TAG=22-alpine \ # --build-arg NODE_RUNTIME_TAG=22-alpine \ # ... # 缺省(DOCKER_MIRROR 为空)等价于原来的 node:22-alpine,本地开发不变 ARG DOCKER_MIRROR="" ARG NODE_BUILDER_TAG="22-alpine" ARG NODE_RUNTIME_TAG="22-alpine" # ========================================== # 第一阶段:依赖安装与构建阶段 # ========================================== FROM ${DOCKER_MIRROR}node:${NODE_BUILDER_TAG} AS builder WORKDIR /app ENV NODE_OPTIONS="--max-old-space-size=1024" ENV VITE_BUILD_THREADS=1 ENV NITRO_PRESET=node-server # 1. 仅复制依赖相关文件和 scripts 目录(因为 postinstall 需要),利用 Docker 缓存层 COPY package.json package-lock.json ./ COPY scripts ./scripts # 配置 npm 镜像加速并安装依赖,严格内存优化 RUN set -eux; \ npm config set registry https://registry.npmmirror.com; \ npm config set maxsockets 3; \ npm config set progress false; \ npm config set cache /tmp/npm-cache; \ npm install --package-lock-only --ignore-scripts; \ npm ci --prefer-offline --no-audit --no-fund --maxsockets=3 # 2. 复制源代码并进行构建 # 只有在 package.json 没变而源代码改变时,才会从这一步开始重新执行,跳过上面的耗时依赖安装 COPY . . # 构建应用,使用内存优化脚本适应4GB总内存 RUN chmod +x scripts/memory-build.js && \ node scripts/memory-build.js RUN npm prune --omit=dev # ========================================== # 第二阶段:运行阶段 # ========================================== FROM ${DOCKER_MIRROR}node:${NODE_RUNTIME_TAG} AS runtime USER root WORKDIR /app # 从构建阶段复制必要文件,剔除无关的开发依赖 COPY --from=builder /app/package.json ./ COPY --from=builder /app/package-lock.json ./ COPY --from=builder /app/drizzle.config.ts ./ COPY --from=builder /app/node_modules ./node_modules COPY --from=builder /app/.output ./.output COPY --from=builder /app/app/drizzle ./app/drizzle COPY --from=builder /app/scripts ./scripts # 如果有 vendor 目录再取消注释 # COPY --from=builder /app/vendor ./vendor # 环境变量配置 ENV NODE_ENV=production \ PORT=3000 \ NPM_CONFIG_UPDATE_NOTIFIER=false \ PREBUILT=true \ NODE_OPTIONS="--max-old-space-size=512" # 暴露端口 EXPOSE $PORT # 启动命令:先执行数据库迁移,再启动应用 CMD ["sh", "-c", "node scripts/deploy.js && node .output/server/index.mjs"]