-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDockerfile
More file actions
83 lines (66 loc) · 2.98 KB
/
Copy pathDockerfile
File metadata and controls
83 lines (66 loc) · 2.98 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
# syntax=docker/dockerfile:1
# 阶段一:前端构建
FROM node:22-alpine AS frontend-builder
WORKDIR /app/frontend
# 国内 CI/构建机若遇 npm 官方源 ECONNRESET,可传: --build-arg NPM_REGISTRY=https://registry.npmmirror.com
ARG NPM_REGISTRY=
RUN npm config set fetch-retries 10 && \
npm config set fetch-retry-mintimeout 20000 && \
npm config set fetch-retry-maxtimeout 120000 && \
npm config set fetch-timeout 600000 && \
if [ -n "$NPM_REGISTRY" ]; then npm config set registry "$NPM_REGISTRY"; fi
COPY frontend/package*.json ./
# 缓存 + 多次重试,缓解跨区/不稳定网络下 npm ci 中断
RUN --mount=type=cache,target=/root/.npm \
sh -ec 'for n in 1 2 3 4 5; do npm ci && exit 0; echo "npm ci failed, retry $n in 15s..."; sleep 15; done; exit 1'
COPY frontend/ ./
RUN npm run build
# 阶段二:Python 运行时
FROM python:3.13-slim
# supervisor + 中文字体。ER/数据流默认输出 Mermaid/Markdown/PDF 摘要,不再内置重型图形组件。
RUN apt-get update && \
apt-get install -y supervisor tini curl fonts-noto-cjk fonts-wqy-microhei fontconfig && \
rm -rf /var/lib/apt/lists/*
# 创建非root用户
RUN useradd -m -u 1000 dbmcp
WORKDIR /app
# 安装Python依赖
COPY requirements.txt /app/requirements.txt
RUN pip install --no-cache-dir -r /app/requirements.txt
# 复制项目文件
COPY . /app
# 复制前端构建产物(覆盖 src/static)
COPY --from=frontend-builder /app/src/static /app/src/static
# 中文字体:优先内置 Noto Sans SC .otf(fpdf2 用 TTC 易叠字乱码),TTC 仅作兜底
RUN mkdir -p /app/src/static/fonts && \
set -e; \
OTF_URL="https://mirrors.ctan.org/fonts/notocjksc/NotoSansCJKsc-Regular.otf"; \
if ! curl -fsSL --retry 3 -o /app/src/static/fonts/NotoSansCJKsc-Regular.otf "$OTF_URL"; then \
echo "WARN: OTF 下载失败,尝试从 apt 复制 TTC 兜底" >&2; \
for name in NotoSansCJKsc-Regular.ttc wqy-microhei.ttc; do \
SRC=$(find /usr/share/fonts -type f -iname "$name" 2>/dev/null | head -1); \
if [ -n "$SRC" ]; then cp "$SRC" "/app/src/static/fonts/$name"; break; fi; \
done; \
fi; \
if [ ! -s /app/src/static/fonts/NotoSansCJKsc-Regular.otf ] && \
[ ! -s /app/src/static/fonts/NotoSansCJK-Regular.ttc ] && \
[ ! -s /app/src/static/fonts/wqy-microhei.ttc ]; then \
echo "ERROR: 未找到可用中文字体" >&2; \
find /usr/share/fonts -iname '*noto*' -o -iname '*wqy*' 2>/dev/null | head -20 >&2; \
exit 1; \
fi; \
fc-cache -fv && ls -la /app/src/static/fonts/
# 创建必要的目录并设置权限
RUN mkdir -p /var/log/db_mcp_server /data/admin && \
chown -R dbmcp:dbmcp /app /var/log/db_mcp_server /data
# 切换到非root用户
USER dbmcp
# 环境变量
ENV TZ=Asia/Shanghai
ENV HOST=0.0.0.0
ENV PORT=3000
ENV LOG_DIR=/var/log/db_mcp_server
EXPOSE 3000
# tini 作 PID 1;supervisord 只管理 web/init_db
ENTRYPOINT ["/usr/bin/tini", "-g", "--"]
CMD ["supervisord", "-c", "/app/docker/supervisord.conf"]