Files
docker-registry/.qoder/repowiki/zh/content/项目概述/kami-spider-monorepo 模块.md
danial 1ecefc80af chore(docker): 优化 Playwright 浏览器安装和配置
- 设置 PLAYWRIGHT_BROWSERS_PATH 环境变量指向 /app/.browsers
- 创建 /app/.browsers 目录用于存放浏览器文件
- 分别以 root 用户和 appuser 用户执行 Playwright 依赖和浏览器安装
- 提升 /app/.browsers 目录权限,保证 appuser 访问权限
- 调整安装步骤顺序,优化权限和用户切换流程

docs(kami-gateway): 新增 kami-gateway 模块文档及构建脚本说明

- 添加了 kami-gateway 模块的整体介绍及项目结构概述
- 详细描述了基础镜像构建流程和核心组件(Dockerfile.base 与 build-base-image.sh)
- 分析了 Go 依赖管理方式及 Docker 构建优化机制
- 介绍了 CI/CD 集成流程及自动化构建逻辑
- 阐述了性能优化措施,包括中国镜像源配置和极速构建策略
- 提供了常见故障排查指南以提高镜像构建和推送的稳定性
- 补充了安全性设计,如非 root 用户运行和证书管理

chore(docker): 更新 Go 模块代理地址

- 将 GOPROXY 从 https://goproxy.cn 更改为 https://goproxy.io
- 保持其他环境变量配置不变
- 解决国内代理访问速度或稳定性问题
2025-12-17 15:33:59 +08:00

12 KiB
Raw Blame History

kami-spider-monorepo 模块

**本文档引用文件** - [README.md](file://kami-spider-monorepo/README.md) - [build-base-image.sh](file://kami-spider-monorepo/build-base-image.sh) - [Dockerfile.base](file://kami-spider-monorepo/Dockerfile.base) - [pyproject.toml](file://kami-spider-monorepo/pyproject.toml) - [uv.lock](file://kami-spider-monorepo/uv.lock)

目录

  1. 简介
  2. 镜像内容与技术架构
  3. Dockerfile.base 技术实现
  4. 依赖管理与可重现构建
  5. 构建脚本与代理支持
  6. 构建命令与工作流程
  7. 安全实践与性能优化
  8. 高级部署与最佳实践

简介

kami-spider-monorepo 模块是 kami-spider 爬虫平台的核心基础镜像构建系统。该模块通过 Docker 容器化技术,为 Python 爬虫应用提供一个预配置、高性能、安全的运行环境。其核心目标是简化爬虫应用的构建流程,通过预集成 Python 3.13 运行时、UV 包管理器、Playwright 浏览器自动化框架以及所有项目依赖,实现“开箱即用”的开发体验。该基础镜像以 kami-spider-base:latest 为标签,是自动化数据采集场景中不可或缺的基础设施。

镜像内容与技术架构

kami-spider 基础镜像是一个功能完备的 Python 爬虫运行时环境,集成了开发和生产所需的所有关键组件。其技术架构设计旨在提供一个稳定、高效且安全的平台。

核心组件

  • Python 3.13 运行时环境:提供最新的 Python 语言特性和性能优化,确保爬虫应用能够利用现代 Python 的所有优势。
  • UV 包管理器:作为现代、快速的 Python 包管理工具UV 显著加速了依赖安装过程,是实现快速构建的关键。
  • Playwright 浏览器自动化框架:预安装了 Chromium 浏览器支持无头headless模式下的网页渲染、交互和数据抓取能够处理复杂的动态网页内容。
  • 预装 Python 依赖包:包含了项目所需的所有第三方库,如 FastAPIWeb 框架、SQLAlchemy数据库 ORM、Redis缓存、Pandas数据处理极大减少了应用镜像的构建时间和复杂性。
  • 系统级运行时库:安装了 Playwright 运行所需的系统依赖如字体库、图形库libnss3, libatk-bridge2.0-0 等),确保浏览器在容器内稳定运行。
  • 非 root 用户配置:遵循最小权限原则,应用在非 root 用户(appuser)下运行,显著提升了容器的安全性。

Section sources

Dockerfile.base 技术实现

Dockerfile.base 是构建 kami-spider 基础镜像的蓝图,其设计体现了高效、安全和可维护性的最佳实践。

多阶段用户切换

Dockerfile 通过精心设计的用户切换流程来平衡权限和安全性:

  1. 初始配置:基于 python:3.13-slim 基础镜像,设置了一系列环境变量,如 PYTHONUNBUFFERED(确保日志实时输出)、PYTHONDONTWRITEBYTECODE(避免生成 __pycache__ 目录)和 UV_CACHE_DIR(指定 UV 缓存目录)。
  2. 系统依赖安装:以 root 用户身份运行,使用 apt-get 安装 Playwright 所需的系统级库(如 libnss3, libasound2, libcups2t64 等),并清理包管理器缓存以减小镜像体积。
  3. 非 root 用户创建:创建名为 appuser 的非 root 用户和组,并设置其主目录。同时创建应用目录 /app 和浏览器缓存目录 /app/.browsers,并正确设置所有权。
  4. 依赖安装:切换到 appuser 用户,复制 pyproject.tomluv.lock 文件,并使用 uv sync 命令安装 Python 依赖。此步骤在非特权用户下执行,降低了依赖安装过程中的安全风险。
  5. Playwright 配置:先切换回 root 用户安装 Playwright 的系统依赖(playwright install-deps chromium),然后再次切换到 appuser 用户来安装 Chromium 浏览器本身(playwright install chromium)。这确保了浏览器文件由运行时用户拥有,避免了权限问题。
  6. 最终清理:最后切换回 root 用户,确保浏览器目录的权限正确,并添加镜像元数据标签。

关键环境变量

  • PLAYWRIGHT_BROWSERS_PATH=/app/.browsers:将浏览器安装到一个持久化且用户可访问的路径,便于管理和缓存。
  • UV_LINK_MODE=copy:配置 UV 使用复制模式而非硬链接,提高在某些文件系统上的兼容性。

Section sources

依赖管理与可重现构建

kami-spider 基础镜像通过 pyproject.tomluv.lock 文件实现了严格的依赖锁定和可重现构建。

pyproject.toml

该文件定义了项目的基本信息和依赖项。它声明了项目名称 kami_spider、Python 版本要求(>=3.13)以及所有直接依赖的包及其版本范围。例如,它指定了 fastapi>=0.120.0playwright>=1.55.0。这为依赖管理提供了声明式的起点。

uv.lock

这是实现可重现构建的核心。uv.lock 文件由 uv 工具生成,它记录了所有依赖(包括传递依赖)的精确版本号、哈希值和下载源。这意味着无论在何时何地构建镜像,只要使用相同的 uv.lock 文件,安装的依赖包版本将完全一致,彻底消除了“在我机器上能运行”的问题。

flowchart TD
A["pyproject.toml\n(声明依赖范围)"] --> B["uv sync\n(解析依赖)"]
B --> C["uv.lock\n(锁定精确版本)"]
C --> D["安装依赖\n(可重现构建)"]

Diagram sources

Section sources

构建脚本与代理支持

build-base-image.sh 脚本自动化了基础镜像的构建、标记和推送流程,并通过 USE_PROXY 环境变量实现了灵活的网络配置。

脚本功能

该脚本接受三个环境变量作为配置:

  • BASE_IMAGE_NAME:镜像名称,默认为 kami-spider-base
  • REGISTRY:目标镜像仓库地址,默认为 localhost:5000
  • USE_PROXY:代理开关,1 表示启用,0 表示禁用,默认为 0
  • VERSION:镜像版本标签,默认为 latest

脚本首先输出配置信息,然后调用 docker build 命令,并通过 --build-arg USE_PROXY 将代理开关传递给 Dockerfile。构建成功后如果指定了非本地仓库脚本会自动为镜像打上仓库前缀的标签并推送至远程仓库。

代理切换机制

Dockerfile.base 中,RUN 指令通过 if 语句检查 USE_PROXY 变量的值。如果为 1,则 uv sync 命令会使用 -i 参数指定国内镜像源(如清华源 https://pypi.tuna.tsinghua.edu.cn/simple/);否则,使用默认的 PyPI 源。这种设计使得镜像构建能够适应不同的网络环境,极大地提高了在受限网络下的构建成功率。

Section sources

构建命令与工作流程

以下是使用 kami-spider 基础镜像的完整工作流程和命令示例。

构建命令

# 1. 无代理构建(使用默认 PyPI 源)
./build-base-image.sh

# 2. 使用代理构建(使用国内镜像源)
USE_PROXY=1 ./build-base-image.sh

# 3. 推送到私有仓库
DOCKER_REGISTRY=your-registry.com USE_PROXY=1 ./build-base-image.sh

工作流程

  1. 准备:确保 Docker 守护进程正在运行。
  2. 构建:执行上述构建命令。脚本会输出构建日志,包括使用的注册表、版本和代理设置。
  3. 验证:构建完成后,脚本会显示成功信息和镜像大小,可通过 docker images 命令验证。
  4. 使用:在应用的 Dockerfile 中,使用 FROM kami-spider-base:latest 作为基础镜像,即可继承所有预配置的环境和依赖。

Section sources

安全实践与性能优化

kami-spider 基础镜像在设计上充分考虑了安全性和性能。

安全实践

  • 非 root 用户运行:这是最重要的安全措施。通过在 Dockerfile 中创建 appuser 并使用 USER appuser 指令,确保了容器内的进程以最小权限运行。即使应用存在漏洞,攻击者也难以获得 root 权限,从而限制了潜在的损害。
  • 精简基础镜像:使用 python:3.13-slim 作为基础,减少了不必要的软件包和潜在的攻击面。
  • 环境变量保护:通过设置 PYDEVD_DISABLE=1 等变量,禁用了调试功能,防止生产环境中意外暴露调试接口。

性能优化

  • 依赖缓存uv 包管理器本身具有高效的缓存机制。通过将 UV_CACHE_DIR 设置为 /tmp/uv-cache 并在安装后清理,可以在多阶段构建中利用 Docker 的构建缓存,加速后续构建。
  • Playwright 资源优化:将 PLAYWRIGHT_BROWSERS_PATH 指向 /app/.browsers,允许在 CI/CD 流水线或本地开发中将此目录挂载为卷,从而避免每次构建都重新下载庞大的 Chromium 浏览器,节省时间和带宽。

Section sources

高级部署与最佳实践

为了在大规模爬虫部署中发挥 kami-spider 基础镜像的最大价值,建议遵循以下最佳实践。

大规模部署最佳实践

  • 私有镜像仓库:将构建好的 kami-spider-base:latest 镜像推送到组织的私有 Docker 仓库(如 Harbor 或 Nexus作为所有爬虫项目的标准基础镜像确保环境一致性。
  • CI/CD 集成:将 build-base-image.sh 脚本集成到 CI/CD 流水线中。当 pyproject.tomluv.lock 发生变更时,自动触发基础镜像的构建和推送,保证所有应用都能及时使用最新的依赖。
  • 资源限制:在 Kubernetes 或 Docker Swarm 等编排系统中部署时,为爬虫容器设置 CPU 和内存限制,防止单个爬虫任务耗尽节点资源。

性能调优建议

  • 依赖缓存策略:在 CI/CD 环境中,可以配置一个持久化的缓存卷来存储 /tmp/uv-cache/app/.browsers 目录,实现跨构建的缓存复用。
  • Playwright 配置:在运行爬虫时,通过环境变量配置 Playwright 以使用无头模式和禁用图片加载等,进一步提升爬取效率。
  • 监控与日志:利用镜像中预装的 opentelemetry 等库,集成分布式追踪和监控,以便于分析爬虫性能瓶颈。

kami-spider 基础镜像通过其全面的预配置和现代化的工具链,为自动化数据采集提供了坚实、高效且安全的基础,是构建复杂爬虫应用的理想起点。

Section sources