-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathDockerfile
More file actions
141 lines (116 loc) · 3.97 KB
/
Copy pathDockerfile
File metadata and controls
141 lines (116 loc) · 3.97 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
# TMDB Helper Docker 配置
# 多阶段构建,支持 Node.js 和 Python 环境
FROM node:22-slim AS base
# 安装系统依赖、Python 支持和 pnpm
RUN apt-get update && apt-get install -y --no-install-recommends \
python3 \
python3-pip \
curl \
ffmpeg \
unzip \
git \
ca-certificates \
# Chromium 运行需要的依赖库
libnss3 \
libnspr4 \
libatk1.0-0 \
libatk-bridge2.0-0 \
libcups2 \
libdrm2 \
libxkbcommon0 \
libxcomposite1 \
libxdamage1 \
libxfixes3 \
libxrandr2 \
libgbm1 \
libpango-1.0-0 \
libcairo2 \
libasound2 \
&& ln -sf /usr/bin/python3 /usr/bin/python \
&& npm install -g pnpm@10 \
&& rm -rf /var/lib/apt/lists/*
# 预装 TMDB-Import 所需的 Python 依赖,实现开箱即用
# 浏览器二进制固定存放在镜像内的 /opt/playwright,运行时由 docker-startup.js 软链到数据卷默认路径
ENV PLAYWRIGHT_BROWSERS_PATH=/opt/playwright
RUN python3 -m pip install --no-cache-dir --break-system-packages \
playwright \
python-dateutil \
Pillow \
bordercrop \
opencc-python-reimplemented \
requests \
&& playwright install --with-deps chromium
# 设置工作目录
WORKDIR /app
# 安装依赖阶段
FROM base AS deps
WORKDIR /app
# 复制包管理文件
COPY package.json pnpm-lock.yaml ./
COPY patches ./patches
# 安装 Node.js 依赖(允许所有构建脚本)
RUN pnpm install --frozen-lockfile
# 构建应用阶段
FROM base AS builder
WORKDIR /app
# 复制依赖
COPY --from=deps /app/node_modules ./node_modules
COPY . .
# 设置构建环境变量
ENV NODE_ENV=production
ENV NEXT_TELEMETRY_DISABLED=1
# 构建 Next.js 应用(启用standalone输出)
ENV OUTPUT_STANDALONE=true
RUN npm run build
# 生产运行时镜像
FROM base AS runner
WORKDIR /app
# 设置生产环境
ENV NODE_ENV=production
ENV NEXT_TELEMETRY_DISABLED=1
ENV PORT=4949
ENV HOSTNAME="0.0.0.0"
ENV DOCKER_CONTAINER=true
ENV TMDB_DATA_DIR=/app/data
ENV TMDB_LOG_DIR=/app/logs
ENV LOG_LEVEL=INFO
ENV NODE_OPTIONS="--max-old-space-size=1024"
# 安全默认值: 生产环境请通过环境变量覆盖
# JWT_SECRET 必须在生产环境中设置一个强随机值
# COOKIE_SECURE 默认关闭,纯 HTTP 部署可直接使用;
# 走 HTTPS 反向代理时通过环境变量 COOKIE_SECURE=true 开启
ENV SESSION_EXPIRY_DAYS=15
# Playwright 环境变量 - 浏览器由用户运行时手动安装
# 使用 /app/data 目录,确保 nextjs 用户有写入权限
ENV PLAYWRIGHT_BROWSERS_PATH=/app/data/.cache/ms-playwright
ENV PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1
# 创建非root用户
RUN addgroup --system --gid 1001 nodejs && \
adduser --system --uid 1001 nextjs
# 复制构建产物
COPY --from=builder /app/public ./public
# 复制 Next.js standalone 输出
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
# 创建必要的目录并设置权限(在 root 下创建,确保权限正确)
RUN mkdir -p /app/data /app/scripts /app/logs && \
chown -R nextjs:nodejs /app/data /app/scripts /app/logs
# 复制脚本文件
COPY --from=builder --chown=nextjs:nodejs /app/scripts ./scripts
# 确保 nextjs 用户可以访问必要的命令和目录
RUN chown -R nextjs:nodejs /app && \
chmod 755 /usr/bin/unzip /usr/bin/cp /usr/bin/mv /usr/bin/rm /usr/bin/git 2>/dev/null || true
USER root
# 设置环境变量确保 PATH 包含系统命令
ENV PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
ENV HOME="/app"
# 预设卷挂载点
VOLUME ["/app/data", "/app/logs"]
# 暴露端口
EXPOSE 4949
# 健康检查
HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \
CMD curl -f http://localhost:4949/api/auth/init || exit 1
# 启动应用
# --experimental-sqlite 标志确保 node:sqlite 在所有 Node.js 22 版本中可用
CMD ["sh", "-c", "node --experimental-sqlite scripts/docker-startup.js && node --experimental-sqlite server.js"]