80 lines
1.9 KiB
Docker
80 lines
1.9 KiB
Docker
# ===============================
|
||
# 极致最小化分步构建 Node 18 + Playwright
|
||
# ===============================
|
||
|
||
# -------------------------------
|
||
# Stage 1: 构建层(安装依赖、Chromium)
|
||
# -------------------------------
|
||
FROM node:18-slim AS builder
|
||
|
||
WORKDIR /app
|
||
|
||
# 复制 package.json / package-lock.json
|
||
COPY package*.json ./
|
||
|
||
# 安装生产依赖(包含 Playwright)
|
||
RUN npm install --omit=dev && npm cache clean --force
|
||
|
||
# 复制自定义中文字体并刷新缓存
|
||
COPY ./fonts/* /usr/share/fonts/
|
||
RUN apt update && \
|
||
apt install -y --no-install-recommends fontconfig && \
|
||
fc-cache -fv && \
|
||
rm -rf /var/lib/apt/lists/*
|
||
|
||
# 安装 Playwright Chromium headless
|
||
RUN npx playwright install chromium --only-shell
|
||
|
||
# 复制应用代码
|
||
COPY server.js ./
|
||
|
||
# -------------------------------
|
||
# Stage 2: 运行层(最终镜像)
|
||
# -------------------------------
|
||
FROM node:18-slim AS runtime
|
||
|
||
WORKDIR /app
|
||
|
||
# 安装依赖,其中lib开头的,是 playwright 需要的依赖。不同版本可能不一样
|
||
RUN apt update && \
|
||
apt install -y --no-install-recommends \
|
||
fontconfig \
|
||
libglib2.0-0 \
|
||
libnspr4 \
|
||
libnss3 \
|
||
libdbus-1-3 \
|
||
libatk1.0-0 \
|
||
libatk-bridge2.0-0 \
|
||
libatspi2.0-0 \
|
||
libx11-6 \
|
||
libxcomposite1 \
|
||
libxdamage1 \
|
||
libxext6 \
|
||
libxfixes3 \
|
||
libxrandr2 \
|
||
libgbm1 \
|
||
libxcb1 \
|
||
libxkbcommon0 \
|
||
libasound2 && \
|
||
rm -rf /var/lib/apt/lists/*
|
||
|
||
# 复制字体
|
||
COPY --from=builder /usr/share/fonts/ /usr/share/fonts/
|
||
RUN fc-cache -fv
|
||
|
||
# 复制 package.json 和 node_modules(包含 Playwright 及依赖)
|
||
COPY --from=builder /app/package.json /app/package.json
|
||
COPY --from=builder /app/node_modules /app/node_modules
|
||
|
||
# 复制应用代码
|
||
COPY --from=builder /app/server.js ./
|
||
|
||
# 复制 Playwright Chromium 缓存
|
||
COPY --from=builder /root/.cache/ms-playwright /root/.cache/ms-playwright
|
||
|
||
# 暴露端口
|
||
EXPOSE 3000
|
||
|
||
# 启动应用
|
||
CMD ["npm", "start"]
|