Skip to content

Commit 907602d

Browse files
committed
fix: Optimize dockerfile
1 parent 05d0598 commit 907602d

File tree

3 files changed

+99
-19
lines changed

3 files changed

+99
-19
lines changed

Diff for: .dockerignore

+2-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,8 @@ tput
4343

4444

4545

46-
46+
docs
47+
build.sh
4748

4849

4950

Diff for: Dockerfile

+91-14
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,106 @@
1-
# 使用 Node.js 18 作为基础镜像
2-
FROM node:18
1+
# 阶段1:基础镜像准备
2+
FROM node:18-alpine AS base
3+
4+
ARG USE_CN_MIRROR
35

46
# 设置工作目录
57
WORKDIR /app
68

7-
# 复制项目文件
9+
# 配置国内镜像源(如果需要)
10+
RUN \
11+
if [ "${USE_CN_MIRROR:-false}" = "true" ]; then \
12+
npm config set registry https://registry.npmmirror.com/; \
13+
fi
14+
15+
# 安装必要的系统依赖(例如CA证书)
16+
RUN apk add --no-cache ca-certificates
17+
18+
# 创建distroless目录,准备复制必要的运行时文件
19+
RUN mkdir -p /distroless/bin /distroless/lib /distroless/etc/ssl/certs /distroless/etc
20+
21+
# 复制Node.js可执行文件
22+
RUN cp /usr/local/bin/node /distroless/bin/
23+
24+
# 复制Node.js运行时依赖的库文件
25+
RUN ldd /usr/local/bin/node | awk '{print $3}' | grep -v '^$' | xargs -I '{}' cp '{}' /distroless/lib/
26+
27+
# 复制动态链接器
28+
RUN cp /lib/ld-musl-$(uname -m).so.1 /distroless/lib/
29+
30+
# 复制CA证书
31+
RUN cp -r /etc/ssl/certs /distroless/etc/ssl/
32+
33+
# 创建非root用户
34+
RUN addgroup -g 1001 appgroup && \
35+
adduser -D -u 1001 -G appgroup appuser
36+
37+
# 复制用户和组信息
38+
RUN cp /etc/passwd /distroless/etc/passwd && \
39+
cp /etc/group /distroless/etc/group
40+
41+
42+
43+
# 阶段2:构建应用程序
44+
FROM base AS builder
45+
46+
ARG USE_CN_MIRROR
47+
48+
WORKDIR /app
49+
50+
# 复制依赖文件
851
COPY package.json yarn.lock ./
952

10-
# 安装依赖
11-
RUN yarn install
53+
# 确保在构建阶段NODE_ENV不为production
54+
ENV NODE_ENV=development
1255

13-
# 复制其余项目文件
56+
# 配置国内镜像源并安装依赖
57+
RUN \
58+
if [ "${USE_CN_MIRROR:-false}" = "true" ]; then \
59+
npm config set registry https://registry.npmmirror.com/; \
60+
fi && \
61+
yarn install
62+
63+
# 复制项目源代码
1464
COPY . .
1565

16-
# 构建前端项目(Vue.js 项目)
66+
# 构建应用程序
1767
RUN yarn build
1868

19-
# 创建数据目录
20-
RUN mkdir -p /app/data
69+
# 重新设置NODE_ENV为production
70+
ENV NODE_ENV=production
71+
72+
# 删除devDependencies,减小最终镜像大小
73+
RUN yarn install --production --ignore-scripts --prefer-offline
74+
75+
# 修改文件权限,使appuser拥有所有权
76+
RUN chown -R appuser:appgroup /app
77+
78+
2179

22-
# 将数据目录设置为卷,以便使用 -v 映射
23-
VOLUME /app/data
80+
# 阶段3:构建最终的生产镜像
81+
FROM scratch
2482

25-
# 暴露端口(如果您的应用在 13000 端口运行)
83+
# 复制distroless文件
84+
COPY --from=base /distroless /
85+
86+
# 复制应用程序文件
87+
COPY --from=builder /app /app
88+
89+
# 设置环境变量
90+
ENV NODE_ENV=production
91+
ENV HOSTNAME="0.0.0.0"
92+
ENV PORT=13000
93+
ENV NODE_OPTIONS="--dns-result-order=ipv4first --use-openssl-ca"
94+
95+
# 设置工作目录
96+
WORKDIR /app
97+
98+
# 暴露端口
2699
EXPOSE 13000
27100

28-
# 启动应用
29-
CMD ["node", "server.js"]
101+
# 使用非root用户
102+
USER appuser
103+
104+
# 启动命令
105+
ENTRYPOINT ["/bin/node"]
106+
CMD ["server.js"]

Diff for: package.json

+6-4
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,17 @@
77
"dev": "vite",
88
"build": "vite build",
99
"preview": "vite preview",
10-
"start": "node server.js"
10+
"start": "node server.js",
11+
"docker:install": "yarn install --production --frozen-lockfile && yarn build"
1112
},
1213
"dependencies": {
1314
"@ant-design/icons-vue": "^7.0.1",
14-
"@vercel/kv": "^3.0.0",
15-
"@vercel/node": "^3.2.24",
1615
"@vueuse/core": "^11.2.0",
1716
"ant-design-vue": "^4.0.0-rc.6",
1817
"axios": "^1.7.7",
1918
"dotenv": "^16.4.5",
2019
"echarts": "^5.5.1",
2120
"express": "^4.21.1",
22-
"path": "^0.12.7",
2321
"vue": "^3.5.12",
2422
"vue-i18n": "^9.14.1",
2523
"vue-router": "^4.4.5"
@@ -31,5 +29,9 @@
3129
"unplugin-vue-components": "^0.27.4",
3230
"vite": "^5.4.10",
3331
"vite-plugin-style-import": "^2.0.0"
32+
},
33+
"optionalDependencies": {
34+
"@vercel/kv": "^3.0.0",
35+
"@vercel/node": "^3.2.24"
3436
}
3537
}

0 commit comments

Comments
 (0)