FROM node:18-alpine # 安装系统依赖和浏览器 RUN apk add --no-cache \ chromium \ nss \ freetype \ freetype-dev \ harfbuzz \ ca-certificates \ ttf-freefont \ wqy-zenhei \ bash \ curl \ # Playwright 运行时依赖 libgcc \ libstdc++ \ libx11 \ libxcomposite \ libxdamage \ libxext \ libxfixes \ libxrandr \ libxtst \ alsa-lib \ at-spi2-core \ cairo \ cups-libs \ dbus-libs \ expat \ gdk-pixbuf \ glib \ gtk+3.0 \ libdrm \ libxkbcommon \ mesa-gbm \ pango \ && rm -rf /var/cache/apk/* # 设置Puppeteer环境变量 ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true \ PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium-browser \ CHROME_BIN=/usr/bin/chromium-browser \ PUPPETEER_ARGS="--no-sandbox --disable-setuid-sandbox --disable-dev-shm-usage" # 设置Playwright环境变量 - 强制使用系统chromium ENV PLAYWRIGHT_BROWSERS_PATH=/usr/bin \ PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=true \ PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH=/usr/bin/chromium-browser \ PLAYWRIGHT_SKIP_VALIDATE_HOST_REQUIREMENTS=true \ PLAYWRIGHT_CHROMIUM_USE_HEADLESS_NEW=true # 创建非root用户 RUN addgroup -g 1001 -S nodejs RUN adduser -S nodejs -u 1001 # 创建缓存目录并设置权限 RUN mkdir -p /home/node/.cache && chown -R nodejs:nodejs /home/node/.cache # 设置工作目录 WORKDIR /app # 复制共享模块 COPY shared/ ./shared/ RUN chown -R nodejs:nodejs ./shared # 复制前端所有文件(包括配置文件) COPY frontend/ ./frontend/ RUN chown -R nodejs:nodejs ./frontend # 复制后端package.json COPY backend/package*.json ./backend/ # 安装前端依赖并构建 WORKDIR /app/frontend USER nodejs RUN npm install RUN npm run build # 切换回root安装后端依赖 USER root WORKDIR /app/backend RUN npm install --omit=dev # 验证系统chromium安装 RUN which chromium-browser && chromium-browser --version # 创建Playwright配置以使用系统chromium RUN mkdir -p /home/node/.cache/ms-playwright && \ echo '{"browsers":[{"name":"chromium","executablePath":"/usr/bin/chromium-browser"}]}' > /home/node/.cache/ms-playwright/browsers.json && \ chown -R nodejs:nodejs /home/node/.cache # 复制后端代码 WORKDIR /app COPY backend/ ./backend/ RUN chown -R nodejs:nodejs ./backend # 设置工作目录为后端 WORKDIR /app/backend # 切换到nodejs用户 USER nodejs # 暴露端口 EXPOSE 7860 # 健康检查 HEALTHCHECK --interval=30s --timeout=10s --start-period=15s --retries=3 \ CMD curl -f http://localhost:7860/api/health || exit 1 # 启动应用 CMD ["npm", "start"]