-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDockerfile.local
More file actions
161 lines (132 loc) · 4.79 KB
/
Dockerfile.local
File metadata and controls
161 lines (132 loc) · 4.79 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
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
# ==========================================
# DomMate - 本地构建版 Dockerfile
# 基于 Ubuntu 20.04,内置Node.js安装
# ==========================================
FROM ubuntu:20.04
# 设置环境变量
ENV NODE_VERSION=22
ENV DEBIAN_FRONTEND=noninteractive
ENV NODE_ENV=production
ENV SERVER_HOST=0.0.0.0
ENV SERVER_PORT=3001
ENV DATABASE_PATH=/app/data/domains.db
ENV BACKUP_DIR=/app/data/backups
# 设置时区
RUN ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo Asia/Shanghai > /etc/timezone
# 更新系统包并安装基础依赖
RUN apt-get update && apt-get install -y \
curl \
wget \
ca-certificates \
gnupg \
lsb-release \
sqlite3 \
python3 \
python3-pip \
build-essential \
&& rm -rf /var/lib/apt/lists/*
# 手动安装Node.js 22
RUN curl -fsSL https://nodejs.org/dist/v22.17.1/node-v22.17.1-linux-x64.tar.xz -o node.tar.xz || \
(echo "网络下载失败,尝试使用apt安装较老版本..." && \
apt-get update && \
apt-get install -y nodejs npm && \
rm -rf /var/lib/apt/lists/*) && \
if [ -f node.tar.xz ]; then \
tar -xJf node.tar.xz && \
cp -r node-v22.17.1-linux-x64/* /usr/local/ && \
rm -rf node-v22.17.1-linux-x64 node.tar.xz; \
fi
# 验证Node.js安装
RUN node --version && npm --version
# 创建应用用户和组
RUN groupadd -g 1001 dommate && \
useradd -r -u 1001 -g dommate dommate
# 设置工作目录
WORKDIR /app
# 创建必要目录并设置权限
RUN mkdir -p /app/data /app/logs /app/backups /app/temp/exports && \
chown -R dommate:dommate /app && \
chmod -R 755 /app
# 复制package文件
COPY package*.json ./
# 设置npm镜像源并安装依赖
RUN npm config set registry https://registry.npmmirror.com/ || \
npm config set registry https://registry.npm.taobao.org/ || \
echo "使用默认registry"
# 安装生产依赖
RUN npm cache clean --force && \
(npm ci --only=production --no-audit --no-fund || \
npm install --production --legacy-peer-deps --no-audit --no-fund)
# 复制源码
COPY . .
# 构建前端 - 多层回退策略
RUN echo "🏗️ 开始构建前端..." && \
(npm run build && echo "✅ 标准构建成功") || \
(echo "标准构建失败,尝试跳过类型检查..." && npm run build --skip-type-check && echo "✅ 跳过类型检查构建成功") || \
(echo "构建失败,尝试rollup修复..." && \
rm -rf node_modules/@rollup/ node_modules/rollup && \
npm install @rollup/rollup-linux-x64-musl --optional --legacy-peer-deps && \
npm run build && echo "✅ Rollup修复构建成功") || \
(echo "Rollup修复失败,完全重新安装..." && \
rm -rf node_modules package-lock.json && \
npm install --legacy-peer-deps && \
npm run build && echo "✅ 重新安装构建成功") || \
echo "⚠️ 所有构建尝试都失败,但容器仍可启动"
# 验证构建产物
RUN if [ -d "dist" ]; then \
echo "✅ 前端构建产物存在,文件数量: $(ls dist/ | wc -l)"; \
else \
echo "❌ 前端构建产物缺失,但服务器仍可运行"; \
fi
# 创建启动脚本
RUN cat > /app/entrypoint.sh << 'EOF'
#!/bin/bash
set -e
echo "🚀 DomMate 容器启动中..."
echo "📊 Node.js 版本: $(node --version)"
echo "📊 运行用户: $(whoami)"
# 确保数据目录存在
echo "📁 确保数据目录存在..."
mkdir -p /app/data/backups 2>/dev/null || {
echo "⚠️ 创建数据目录需要权限..."
sudo mkdir -p /app/data/backups 2>/dev/null || mkdir -p /app/data/backups
}
# 检查目录权限
if [ -w "/app/data" ]; then
echo "✅ 数据目录权限正常"
else
echo "⚠️ 数据目录权限不足,尝试修复..."
chmod -R 755 /app/data 2>/dev/null || echo "权限修复失败,继续启动..."
fi
# 显示环境信息
echo "⚙️ 环境配置:"
echo " • 数据库路径: ${DATABASE_PATH}"
echo " • 备份目录: ${BACKUP_DIR}"
echo " • 服务端口: ${SERVER_PORT}"
# 检查前端构建产物
if [ -f "/app/dist/index.html" ]; then
echo "✅ 前端构建产物存在"
else
echo "❌ 前端构建产物缺失,但服务器仍可运行"
fi
echo "🎯 启动DomMate应用..."
exec "$@"
EOF
# 设置启动脚本权限
RUN chmod +x /app/entrypoint.sh && \
chown dommate:dommate /app/entrypoint.sh
# 安装sudo(用于权限修复)
RUN apt-get update && apt-get install -y sudo && \
echo "dommate ALL=(ALL) NOPASSWD: /bin/mkdir, /bin/chown, /bin/chmod" > /etc/sudoers.d/dommate && \
rm -rf /var/lib/apt/lists/*
# 切换到应用用户
USER dommate
# 健康检查
HEALTHCHECK --interval=30s --timeout=10s --start-period=30s --retries=3 \
CMD curl -f http://localhost:${SERVER_PORT}/health || exit 1
# 暴露端口
EXPOSE 3001
# 使用启动脚本
ENTRYPOINT ["/app/entrypoint.sh"]
# 启动应用
CMD ["node", "server/index.js"]