- 设置 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 - 保持其他环境变量配置不变 - 解决国内代理访问速度或稳定性问题
12 KiB
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)目录
简介
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 依赖包:包含了项目所需的所有第三方库,如 FastAPI(Web 框架)、SQLAlchemy(数据库 ORM)、Redis(缓存)、Pandas(数据处理)等,极大减少了应用镜像的构建时间和复杂性。
- 系统级运行时库:安装了 Playwright 运行所需的系统依赖,如字体库、图形库(libnss3, libatk-bridge2.0-0 等),确保浏览器在容器内稳定运行。
- 非 root 用户配置:遵循最小权限原则,应用在非 root 用户(
appuser)下运行,显著提升了容器的安全性。
Section sources
Dockerfile.base 技术实现
Dockerfile.base 是构建 kami-spider 基础镜像的蓝图,其设计体现了高效、安全和可维护性的最佳实践。
多阶段用户切换
Dockerfile 通过精心设计的用户切换流程来平衡权限和安全性:
- 初始配置:基于
python:3.13-slim基础镜像,设置了一系列环境变量,如PYTHONUNBUFFERED(确保日志实时输出)、PYTHONDONTWRITEBYTECODE(避免生成__pycache__目录)和UV_CACHE_DIR(指定 UV 缓存目录)。 - 系统依赖安装:以 root 用户身份运行,使用
apt-get安装 Playwright 所需的系统级库(如libnss3,libasound2,libcups2t64等),并清理包管理器缓存以减小镜像体积。 - 非 root 用户创建:创建名为
appuser的非 root 用户和组,并设置其主目录。同时创建应用目录/app和浏览器缓存目录/app/.browsers,并正确设置所有权。 - 依赖安装:切换到
appuser用户,复制pyproject.toml和uv.lock文件,并使用uv sync命令安装 Python 依赖。此步骤在非特权用户下执行,降低了依赖安装过程中的安全风险。 - Playwright 配置:先切换回 root 用户安装 Playwright 的系统依赖(
playwright install-deps chromium),然后再次切换到appuser用户来安装 Chromium 浏览器本身(playwright install chromium)。这确保了浏览器文件由运行时用户拥有,避免了权限问题。 - 最终清理:最后切换回 root 用户,确保浏览器目录的权限正确,并添加镜像元数据标签。
关键环境变量
PLAYWRIGHT_BROWSERS_PATH=/app/.browsers:将浏览器安装到一个持久化且用户可访问的路径,便于管理和缓存。UV_LINK_MODE=copy:配置 UV 使用复制模式而非硬链接,提高在某些文件系统上的兼容性。
Section sources
依赖管理与可重现构建
kami-spider 基础镜像通过 pyproject.toml 和 uv.lock 文件实现了严格的依赖锁定和可重现构建。
pyproject.toml
该文件定义了项目的基本信息和依赖项。它声明了项目名称 kami_spider、Python 版本要求(>=3.13)以及所有直接依赖的包及其版本范围。例如,它指定了 fastapi>=0.120.0 和 playwright>=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
工作流程
- 准备:确保 Docker 守护进程正在运行。
- 构建:执行上述构建命令。脚本会输出构建日志,包括使用的注册表、版本和代理设置。
- 验证:构建完成后,脚本会显示成功信息和镜像大小,可通过
docker images命令验证。 - 使用:在应用的 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.toml或uv.lock发生变更时,自动触发基础镜像的构建和推送,保证所有应用都能及时使用最新的依赖。 - 资源限制:在 Kubernetes 或 Docker Swarm 等编排系统中部署时,为爬虫容器设置 CPU 和内存限制,防止单个爬虫任务耗尽节点资源。
性能调优建议
- 依赖缓存策略:在 CI/CD 环境中,可以配置一个持久化的缓存卷来存储
/tmp/uv-cache和/app/.browsers目录,实现跨构建的缓存复用。 - Playwright 配置:在运行爬虫时,通过环境变量配置 Playwright 以使用无头模式和禁用图片加载等,进一步提升爬取效率。
- 监控与日志:利用镜像中预装的
opentelemetry等库,集成分布式追踪和监控,以便于分析爬虫性能瓶颈。
kami-spider 基础镜像通过其全面的预配置和现代化的工具链,为自动化数据采集提供了坚实、高效且安全的基础,是构建复杂爬虫应用的理想起点。
Section sources