-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDockerfile
More file actions
137 lines (108 loc) · 4.83 KB
/
Copy pathDockerfile
File metadata and controls
137 lines (108 loc) · 4.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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
# =============================================================================
# 仅用于本地开发使用,不要用于生产环境
# CUI Server Dockerfile — 基于 openEuler 22.03 LTS
# 多阶段构建:builder (编译) → runtime (运行)
# =============================================================================
# ---------------------------------------------------------------------------
# Stage 1: Builder — 安装编译工具、Node.js,编译项目
# ---------------------------------------------------------------------------
FROM openeuler/openeuler:22.03-lts AS builder
# Node.js 版本
ARG NODE_VERSION=20.19.0
# 安装编译所需的系统依赖
RUN dnf install -y \
gcc gcc-c++ make python3 \
tar gzip xz wget ca-certificates \
&& dnf clean all
# 安装 Node.js(从官方 tarball)
# 自动检测架构:x86_64 → x64, aarch64 → arm64
RUN ARCH=$(uname -m) && \
if [ "$ARCH" = "x86_64" ]; then NODE_ARCH=x64; \
elif [ "$ARCH" = "aarch64" ]; then NODE_ARCH=arm64; \
else echo "Unsupported architecture: $ARCH" && exit 1; fi && \
wget -q "https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-${NODE_ARCH}.tar.xz" \
-O /tmp/node.tar.xz && \
mkdir -p /usr/local/lib/nodejs && \
tar -xJf /tmp/node.tar.xz -C /usr/local/lib/nodejs --strip-components=1 && \
rm /tmp/node.tar.xz
ENV PATH="/usr/local/lib/nodejs/bin:${PATH}"
# 验证 Node.js 安装
RUN node --version && npm --version
WORKDIR /app
# 先复制 package 文件,利用 Docker 层缓存
COPY package.json package-lock.json ./
# 安装所有依赖(包含 devDependencies,构建需要)
RUN npm ci
# 复制项目源码
COPY . .
# 构建项目(编译 TypeScript + 打包前端 + chmod MCP server)
RUN npm run build
# 清理 devDependencies,只保留生产依赖
RUN npm prune --production
# ---------------------------------------------------------------------------
# Stage 2: Runtime — 精简的运行时镜像
# ---------------------------------------------------------------------------
FROM openeuler/openeuler:22.03-lts AS runtime
ARG NODE_VERSION=20.19.0
# 只安装运行时最小依赖
RUN dnf install -y \
tar xz wget ca-certificates \
# better-sqlite3 运行时需要 libstdc++(默认已有)
&& dnf clean all
# 安装 Node.js 运行时
RUN ARCH=$(uname -m) && \
if [ "$ARCH" = "x86_64" ]; then NODE_ARCH=x64; \
elif [ "$ARCH" = "aarch64" ]; then NODE_ARCH=arm64; \
else echo "Unsupported architecture: $ARCH" && exit 1; fi && \
wget -q "https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-${NODE_ARCH}.tar.xz" \
-O /tmp/node.tar.xz && \
mkdir -p /usr/local/lib/nodejs && \
tar -xJf /tmp/node.tar.xz -C /usr/local/lib/nodejs --strip-components=1 && \
rm /tmp/node.tar.xz
ENV PATH="/app/node_modules/.bin:/usr/local/lib/nodejs/bin:${PATH}"
# 安装 sudo 并创建 hadoop 用户
RUN dnf install -y sudo && dnf clean all && \
groupadd -g 1000 hadoop && \
useradd -u 1000 -g hadoop -m -d /home/hadoop hadoop && \
echo "hadoop ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/hadoop && \
chmod 0440 /etc/sudoers.d/hadoop
WORKDIR /app
# 从 builder 阶段复制构建产物 (直接设置 owner,避免后续 chown -R /app 极慢的问题)
COPY --from=builder --chown=hadoop:hadoop /app/dist ./dist
COPY --from=builder --chown=hadoop:hadoop /app/node_modules ./node_modules
COPY --from=builder --chown=hadoop:hadoop /app/package.json ./
COPY --from=builder --chown=hadoop:hadoop /app/config ./config
COPY --from=builder --chown=hadoop:hadoop /app/public ./public
COPY --from=builder --chown=hadoop:hadoop /app/scripts ./scripts
# 复制入口脚本
COPY --chown=hadoop:hadoop docker-entrypoint.sh /docker-entrypoint.sh
RUN chmod +x /docker-entrypoint.sh
# 创建数据目录
RUN mkdir -p /home/hadoop/.cui /app/logs /data/bdp/data-agent && \
chown -R hadoop:hadoop /home/hadoop /app/logs /data/bdp/data-agent && \
chmod 775 /data/bdp/data-agent
# 环境变量默认值
ENV NODE_ENV=production \
PORT=3003 \
HOST=0.0.0.0 \
CUI_CONFIG_ENV=dev \
HOME=/home/hadoop
# ---- 下面是易变动的用户配置 ----
# arionliu 用户(普通用户)- 放在最后以利用缓存
RUN useradd -m -d /home/arionliu arionliu && \
mkdir -p /mnt/bdap/arionliu && \
chown arionliu:arionliu /mnt/bdap/arionliu && \
chmod 700 /mnt/bdap/arionliu && \
useradd -m -d /home/xlinliu xlinliu && \
mkdir -p /mnt/bdap/xlinliu && \
chown xlinliu:xlinliu /mnt/bdap/xlinliu && \
chmod 700 /mnt/bdap/xlinliu
# 确保启动脚本有执行权限
RUN chmod +x scripts/cui-server.sh
EXPOSE 3003
# 切换到 hadoop 用户启动服务
USER hadoop
# 强制指定 Node.js 路径,防止脚本自动检测错误
ENV NODE_BIN=/usr/local/lib/nodejs/bin/node
ENTRYPOINT ["/docker-entrypoint.sh"]
CMD ["scripts/cui-server.sh", "--config-env", "dev-local", "run"]