Files
BYW-VoiceHub/Dockerfile
T
Henry_Du 124280a92f fix(ci): 消除 preflight Set up job docker pull 卡点,改用宿主机 Node 22 + daemon.json mirrors + Dockerfile ARG 双保险
- preflight:删除 container.image: node:22-bookworm-slim,避免 Runner 在 Set up job 阶段独立 docker pull(国内连 Hub 被限速一直卡)
- preflight:改用 runs-on 直出 + actions/setup-node@v4 装 Node 22,npm registry 设 npmmirror
- build-image:python3 合法合成 /etc/docker/daemon.json 注入 3 组 docker.io registry mirrors(daocloud/1panel/1ms.run),systemctl→service→失败跳过 三级 non-intrusive 重启 docker
- Dockerfile:新增全局 ARG DOCKER_MIRROR / NODE_BUILDER_TAG / NODE_RUNTIME_TAG,FROM 统一前缀化;本地开发 DOCKER_MIRROR 为空时等价原写法,体验不变
- buildx BUILD_ARGS:新增 3 个 --build-arg 把 DOCKER_MIRROR_PREFIX / NODE_BUILDER_TAG / NODE_RUNTIME_TAG 传入,CI 拉 node:22-alpine 必走国内源
- 修复后:workflow 触发时 Preflight 日志不会再出现 Starting job container / docker pull image=node:***-bookworm-slim;前面 system-settings defaults 兜底修复可顺利部署上线
2026-09-11 21:59:19 +08:00

76 lines
2.6 KiB
Docker

# 支持: 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"]