FROM node:18-alpine # 安装系统依赖(无头浏览器已禁用) RUN apk add --no-cache \ freetype \ freetype-dev \ harfbuzz \ ca-certificates \ ttf-freefont \ git \ python3 \ make \ g++ \ curl \ && rm -rf /var/cache/apk/* # 无头浏览器功能已禁用 # ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true \ # PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium-browser \ # PUPPETEER_CACHE_DIR=/tmp/.puppeteer_cache \ # PUPPETEER_ARGS="--no-sandbox --disable-setuid-sandbox --disable-dev-shm-usage" \ # PUPPETEER_DISABLE_HEADLESS_WARNING=true # 设置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 /data /data/images /data/metadata /data/users && \ chown -R nodejs:nodejs /data # 创建缓存目录并设置权限 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 package*.json ./ # 复制后端package.json和配置文件 COPY backend/package*.json ./backend/ COPY backend/.eslintrc.js ./backend/ COPY backend/.prettierrc ./backend/ COPY backend/babel.config.js ./backend/ # 安装前端依赖并构建 WORKDIR /app/frontend USER nodejs # 优化npm配置以提高构建稳定性 RUN npm config set fetch-retry-mintimeout 20000 && \ npm config set fetch-retry-maxtimeout 120000 && \ npm config set fetch-timeout 300000 RUN npm install RUN npm run build # 切换回root安装依赖 USER root WORKDIR /app RUN npm install --omit=dev WORKDIR /app/backend RUN npm install --omit=dev # 验证系统依赖安装(chromium验证已移除) RUN echo "System dependencies installed successfully" # Playwright配置已禁用 # 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 node:node /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"]