|
1 |
| -# 使用 Node.js 18 作为基础镜像 |
2 |
| -FROM node:18 |
| 1 | +# 阶段1:基础镜像准备 |
| 2 | +FROM node:18-alpine AS base |
| 3 | + |
| 4 | +ARG USE_CN_MIRROR |
3 | 5 |
|
4 | 6 | # 设置工作目录
|
5 | 7 | WORKDIR /app
|
6 | 8 |
|
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 | +# 复制依赖文件 |
8 | 51 | COPY package.json yarn.lock ./
|
9 | 52 |
|
10 |
| -# 安装依赖 |
11 |
| -RUN yarn install |
| 53 | +# 确保在构建阶段NODE_ENV不为production |
| 54 | +ENV NODE_ENV=development |
12 | 55 |
|
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 | +# 复制项目源代码 |
14 | 64 | COPY . .
|
15 | 65 |
|
16 |
| -# 构建前端项目(Vue.js 项目) |
| 66 | +# 构建应用程序 |
17 | 67 | RUN yarn build
|
18 | 68 |
|
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 | + |
21 | 79 |
|
22 |
| -# 将数据目录设置为卷,以便使用 -v 映射 |
23 |
| -VOLUME /app/data |
| 80 | +# 阶段3:构建最终的生产镜像 |
| 81 | +FROM scratch |
24 | 82 |
|
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 | +# 暴露端口 |
26 | 99 | EXPOSE 13000
|
27 | 100 |
|
28 |
| -# 启动应用 |
29 |
| -CMD ["node", "server.js"] |
| 101 | +# 使用非root用户 |
| 102 | +USER appuser |
| 103 | + |
| 104 | +# 启动命令 |
| 105 | +ENTRYPOINT ["/bin/node"] |
| 106 | +CMD ["server.js"] |
0 commit comments