-
Notifications
You must be signed in to change notification settings - Fork 343
Expand file tree
/
Copy pathDockerfile
More file actions
114 lines (95 loc) · 3.83 KB
/
Dockerfile
File metadata and controls
114 lines (95 loc) · 3.83 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
# ============================================
# Build stage
# ============================================
FROM node:24-alpine AS builder
RUN npm install -g bun@latest
WORKDIR /app
# 构建时固定的环境变量
ENV NODE_ENV=production \
NEXT_TELEMETRY_DISABLED=1 \
UPTIME_KUMA_URLS= \
UPTIME_KUMA_BASE_URL=https://whimsical-sopapillas-78abba.netlify.app \
PAGE_ID=demo \
KUMA_MIERU_EDIT_THIS_PAGE=false \
KUMA_MIERU_SHOW_STAR_BUTTON=true \
KUMA_MIERU_TITLE="Uptime Kuma" \
KUMA_MIERU_DESCRIPTION="A beautiful and modern uptime monitoring dashboard" \
KUMA_MIERU_ICON="" \
ALLOW_EMBEDDING=false
# 复制依赖文件
COPY package.json bun.lock ./
COPY scripts ./scripts
COPY utils ./utils
# 使用 Bun 安装依赖
RUN set -e && \
echo "Installing dependencies..." && \
bun install --frozen-lockfile || { echo "Failed to install dependencies"; exit 1; }
# 复制源代码
COPY . .
# 使用 Node.js 构建应用
RUN set -e && \
echo "Starting build process..." && \
bun run generate && \
npx next build || { echo "Build failed"; exit 1; }
# ============================================
# Runtime stage
# ============================================
FROM node:24-alpine
WORKDIR /app
# 运行时的所有 ARG 和 ENV 配置
ARG PORT=3000
ARG HOSTNAME="0.0.0.0"
ARG NODE_ENV=production
ARG NEXT_TELEMETRY_DISABLED=1
ARG UPTIME_KUMA_URLS=
ARG UPTIME_KUMA_BASE_URL=https://whimsical-sopapillas-78abba.netlify.app
ARG PAGE_ID=demo
ARG KUMA_MIERU_EDIT_THIS_PAGE=false
ARG KUMA_MIERU_SHOW_STAR_BUTTON=true
ARG KUMA_MIERU_TITLE="Uptime Kuma"
ARG KUMA_MIERU_DESCRIPTION="A beautiful and modern uptime monitoring dashboard"
ARG KUMA_MIERU_ICON=
ARG ALLOW_EMBEDDING=false
ARG IS_DOCKER=true
ENV PORT=${PORT} \
HOSTNAME=${HOSTNAME} \
NODE_ENV=${NODE_ENV} \
NEXT_TELEMETRY_DISABLED=${NEXT_TELEMETRY_DISABLED} \
UPTIME_KUMA_URLS=${UPTIME_KUMA_URLS} \
UPTIME_KUMA_BASE_URL=${UPTIME_KUMA_BASE_URL} \
PAGE_ID=${PAGE_ID} \
KUMA_MIERU_EDIT_THIS_PAGE=${KUMA_MIERU_EDIT_THIS_PAGE} \
KUMA_MIERU_SHOW_STAR_BUTTON=${KUMA_MIERU_SHOW_STAR_BUTTON} \
KUMA_MIERU_TITLE=${KUMA_MIERU_TITLE} \
KUMA_MIERU_DESCRIPTION=${KUMA_MIERU_DESCRIPTION} \
KUMA_MIERU_ICON=${KUMA_MIERU_ICON} \
ALLOW_EMBEDDING=${ALLOW_EMBEDDING} \
IS_DOCKER=${IS_DOCKER} \
PATH="$PATH:/app/node_modules/.bin"
# 安装运行时需要的工具(healthcheck 用)
RUN apk add --no-cache curl dumb-init && \
addgroup -g 1001 -S nodejs && \
adduser -S nextjs -u 1001 && \
chown -R nextjs:nodejs /app
# 切换到非 root 用户
USER nextjs
# 创建最小化的 package.json 只包含运行时依赖
# 包括 serverExternalPackages 声明的包:sharp, cheerio
# 以及 generate 脚本需要的:zod, json5, dotenv, chalk
# tsx 用于运行 TypeScript 启动脚本(替代 Bun,避免 AVX2 指令集兼容性问题)
RUN npm install --prefer-online --omit=dev sharp cheerio zod json5 dotenv chalk tsx
# 从 builder 复制构建产物(standalone 输出)
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone/ ./
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
COPY --from=builder --chown=nextjs:nodejs /app/public ./public
COPY --from=builder --chown=nextjs:nodejs /app/config ./config
COPY --from=builder --chown=nextjs:nodejs /app/scripts ./scripts
COPY --from=builder --chown=nextjs:nodejs /app/utils ./utils
EXPOSE ${PORT}
# Healthcheck 配置
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s \
CMD curl -f http://localhost:${PORT}/api/health || exit 1
# 使用 dumb-init 作为 PID 1,正确处理信号
# 使用 tsx 运行 TypeScript 启动脚本,使用 Node.js 运行 standalone 服务器
ENTRYPOINT ["/usr/bin/dumb-init", "--"]
CMD ["sh", "-c", "tsx scripts/generate-config.ts && tsx scripts/generate-image-domains.ts && tsx scripts/banner.ts && exec node server.js"]