53 lines
2.1 KiB
Docker
53 lines
2.1 KiB
Docker
FROM node:22-alpine AS builder
|
||
|
||
WORKDIR /app
|
||
|
||
RUN npm install -g pnpm@10
|
||
|
||
COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./
|
||
RUN pnpm install --frozen-lockfile
|
||
|
||
# NEXT_PUBLIC_* 会在构建时内联进浏览器代码;默认同源 /api,不能留空(空串不会触发代码里的默认值)
|
||
ARG NEXT_PUBLIC_API_BASE_URL=/api
|
||
ENV NEXT_PUBLIC_API_BASE_URL=$NEXT_PUBLIC_API_BASE_URL \
|
||
NEXT_TELEMETRY_DISABLED=1
|
||
|
||
COPY . .
|
||
RUN pnpm build
|
||
|
||
FROM node:22-alpine
|
||
|
||
ENV NODE_ENV=production \
|
||
NEXT_TELEMETRY_DISABLED=1 \
|
||
HOSTNAME=127.0.0.1 \
|
||
PORT=22787 \
|
||
TZ=Asia/Shanghai
|
||
|
||
WORKDIR /app
|
||
|
||
COPY --from=builder --chown=node:node /app/.next/standalone ./
|
||
COPY --from=builder --chown=node:node /app/.next/static ./.next/static
|
||
COPY --from=builder --chown=node:node /app/public ./public
|
||
# 数据库迁移文件:启动时自动应用(src/server/db/migrate.ts)
|
||
COPY --from=builder --chown=node:node /app/drizzle ./drizzle
|
||
# WebDAV 独立进程复用同一容器内的 Next API
|
||
COPY --from=builder --chown=node:node /app/src/server/webdav ./src/server/webdav
|
||
COPY --from=builder --chown=node:node /app/scripts ./scripts
|
||
# Next 不追踪独立脚本的依赖;仅复制 XML 解析器的自包含 CJS 构建与入口描述
|
||
COPY --from=builder --chown=node:node /app/node_modules/fast-xml-parser/lib ./node_modules/fast-xml-parser/lib
|
||
COPY --from=builder --chown=node:node /app/node_modules/fast-xml-parser/package.json ./node_modules/fast-xml-parser/package.json
|
||
|
||
# SQLite 数据库目录:生产环境通过 DB_FILE_NAME 指向挂载卷;预先创建并授权,未挂载时也能启动
|
||
RUN mkdir -p /app/data && chown node:node /app/data
|
||
|
||
USER node
|
||
|
||
EXPOSE 22787 3201
|
||
|
||
# 端口可由 -e PORT 覆盖,检查必须跟随实际端口(host 网络下写死会探测到别的服务)
|
||
HEALTHCHECK --interval=10s --timeout=5s --start-period=10s --retries=3 \
|
||
CMD wget -q --spider http://127.0.0.1:${PORT}/login || exit 1
|
||
|
||
# 配置由部署时挂载的 /app/.env 提供(不存在则忽略);已通过 -e 传入的变量优先,不会被覆盖
|
||
CMD ["node", "--env-file-if-exists=/app/.env", "scripts/start.mjs"]
|