diff --git a/.qoder/repowiki/zh/content/alpine-base 模块.md b/.qoder/repowiki/zh/content/alpine-base 模块.md new file mode 100644 index 0000000..e9676fc --- /dev/null +++ b/.qoder/repowiki/zh/content/alpine-base 模块.md @@ -0,0 +1,186 @@ +# alpine-base 模块 + + +**Referenced Files in This Document** +- [README.md](file://alpine-base/README.md) +- [build-base-image.sh](file://alpine-base/build-base-image.sh) +- [Dockerfile.base](file://alpine-base/Dockerfile.base) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概述](#架构概述) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) + +## 简介 +`alpine-base` 模块是一个优化的 Alpine Linux 基础镜像,专为各种容器化应用设计。该镜像基于 `alpine:latest`,配置了中国镜像源以加速包下载,设置了 `Asia/Shanghai` 时区,并预装了常用的网络和系统工具。此外,镜像还包含了 CA 证书和自定义证书,确保了安全性和兼容性。通过创建非 root 用户 `appuser`(UID: 1001),提高了安全性。镜像大小约为 50MB,适合轻量级应用。 + +## 项目结构 +`alpine-base` 模块包含以下文件: +- `README.md`:项目说明文档 +- `build-base-image.sh`:基础镜像构建脚本 +- `Dockerfile.base`:基础镜像定义文件 + +```mermaid +graph TD +A[alpine-base] --> B[README.md] +A --> C[build-base-image.sh] +A --> D[Dockerfile.base] +``` + +**Diagram sources** +- [README.md](file://alpine-base/README.md#L1-L70) +- [build-base-image.sh](file://alpine-base/build-base-image.sh#L1-L51) +- [Dockerfile.base](file://alpine-base/Dockerfile.base#L1-L58) + +**Section sources** +- [README.md](file://alpine-base/README.md#L1-L70) +- [build-base-image.sh](file://alpine-base/build-base-image.sh#L1-L51) +- [Dockerfile.base](file://alpine-base/Dockerfile.base#L1-L58) + +## 核心组件 +`alpine-base` 模块的核心组件包括 `Dockerfile.base` 和 `build-base-image.sh`。`Dockerfile.base` 定义了基础镜像的构建过程,而 `build-base-image.sh` 脚本则负责执行构建、打标和推送操作。 + +**Section sources** +- [Dockerfile.base](file://alpine-base/Dockerfile.base#L1-L58) +- [build-base-image.sh](file://alpine-base/build-base-image.sh#L1-L51) + +## 架构概述 +`alpine-base` 模块的架构主要包括以下几个部分: +1. **基础镜像**:基于 `alpine:latest`。 +2. **镜像源配置**:使用阿里云镜像源加速包下载。 +3. **时区设置**:设置为 `Asia/Shanghai`。 +4. **预装工具**:包括 `curl`、`wget`、`git`、`bash`、`tar`、`gzip` 等。 +5. **证书管理**:包含 CA 证书和自定义证书。 +6. **用户配置**:创建非 root 用户 `appuser`(UID: 1001)。 +7. **应用目录**:创建 `/app` 目录并设置权限。 + +```mermaid +graph TD +A[alpine:latest] --> B[配置阿里云镜像源] +B --> C[设置时区为Asia/Shanghai] +C --> D[安装预装工具] +D --> E[下载并更新证书] +E --> F[创建非root用户appuser] +F --> G[创建应用目录/app] +G --> H[切换到appuser用户] +H --> I[设置工作目录为/app] +I --> J[标记镜像] +``` + +**Diagram sources** +- [Dockerfile.base](file://alpine-base/Dockerfile.base#L1-L58) + +## 详细组件分析 + +### Dockerfile.base 分析 +`Dockerfile.base` 文件定义了基础镜像的构建过程。以下是其主要步骤: + +1. **基础镜像**:从 `alpine:latest` 开始。 +2. **环境变量**:设置 `TZ` 为 `Asia/Shanghai`。 +3. **镜像源配置**:将阿里云镜像源写入 `/etc/apk/repositories`。 +4. **安装包**:更新包列表,升级现有包,并安装一系列常用工具和证书。 +5. **时区设置**:复制 `Asia/Shanghai` 时区信息到 `/etc/localtime`,并写入 `/etc/timezone`。 +6. **清理缓存**:删除 `/var/cache/apk/*` 以减少镜像大小。 +7. **下载自定义证书**:从指定 URL 下载自定义证书并更新 CA 证书。 +8. **创建非 root 用户**:创建 `appuser` 用户和组,UID 为 1001。 +9. **创建应用目录**:创建 `/app` 目录并设置所有者为 `appuser`。 +10. **切换用户**:切换到 `appuser` 用户。 +11. **设置工作目录**:设置工作目录为 `/app`。 +12. **标记镜像**:添加维护者、版本和描述标签。 + +```mermaid +flowchart TD +Start([开始]) --> BaseImage["FROM alpine:latest"] +BaseImage --> SetEnv["ENV TZ=Asia/Shanghai"] +SetEnv --> ConfigureRepo["配置阿里云镜像源"] +ConfigureRepo --> InstallPackages["安装包"] +InstallPackages --> SetupTimezone["设置时区"] +SetupTimezone --> Cleanup["清理缓存"] +Cleanup --> DownloadCerts["下载自定义证书"] +DownloadCerts --> CreateUser["创建非root用户appuser"] +CreateUser --> CreateAppDir["创建应用目录/app"] +CreateAppDir --> SwitchUser["切换到appuser用户"] +SwitchUser --> SetWorkDir["设置工作目录为/app"] +SetWorkDir --> LabelImage["标记镜像"] +LabelImage --> End([结束]) +``` + +**Diagram sources** +- [Dockerfile.base](file://alpine-base/Dockerfile.base#L1-L58) + +**Section sources** +- [Dockerfile.base](file://alpine-base/Dockerfile.base#L1-L58) + +### build-base-image.sh 分析 +`build-base-image.sh` 脚本负责构建、打标和推送基础镜像。以下是其主要步骤: + +1. **配置**:设置基础镜像名称、注册表和版本。 +2. **构建镜像**:使用 `docker build` 命令构建镜像,并打上版本和 latest 标签。 +3. **标记注册表**:如果指定了注册表,则为镜像打上注册表标签。 +4. **推送镜像**:如果指定了注册表,则将镜像推送到注册表。 +5. **显示镜像大小**:显示构建完成后的镜像大小。 + +```mermaid +flowchart TD +Start([开始]) --> Config["配置变量"] +Config --> BuildImage["构建基础镜像"] +BuildImage --> TagRegistry["标记注册表"] +TagRegistry --> PushImage["推送镜像"] +PushImage --> ShowSize["显示镜像大小"] +ShowSize --> End([结束]) +``` + +**Diagram sources** +- [build-base-image.sh](file://alpine-base/build-base-image.sh#L1-L51) + +**Section sources** +- [build-base-image.sh](file://alpine-base/build-base-image.sh#L1-L51) + +## 依赖分析 +`alpine-base` 模块依赖于 `alpine:latest` 镜像,并通过 `apk` 包管理器安装了一系列工具和证书。这些依赖项确保了镜像的功能性和安全性。 + +```mermaid +graph TD +A[alpine:latest] --> B[apk-tools] +B --> C[curl] +B --> D[wget] +B --> E[git] +B --> F[bash] +B --> G[tar] +B --> H[gzip] +B --> I[ca-certificates] +I --> J[自定义证书] +``` + +**Diagram sources** +- [Dockerfile.base](file://alpine-base/Dockerfile.base#L1-L58) + +**Section sources** +- [Dockerfile.base](file://alpine-base/Dockerfile.base#L1-L58) + +## 性能考虑 +`alpine-base` 模块通过以下方式优化性能: +- **轻量化**:基于 Alpine Linux,镜像大小约为 50MB。 +- **快速构建**:预装常用工具和配置,减少构建时间。 +- **网络优化**:使用阿里云镜像源加速包下载。 +- **安全**:创建非 root 用户 `appuser`,提高安全性。 + +## 故障排除指南 +如果在构建或使用 `alpine-base` 镜像时遇到问题,可以参考以下建议: +- **构建失败**:检查 `Dockerfile.base` 中的命令是否正确,确保网络连接正常。 +- **推送失败**:确认 `DOCKER_REGISTRY` 环境变量是否正确设置,检查 Docker 登录状态。 +- **权限问题**:确保 `appuser` 用户和 `/app` 目录的权限设置正确。 + +**Section sources** +- [Dockerfile.base](file://alpine-base/Dockerfile.base#L1-L58) +- [build-base-image.sh](file://alpine-base/build-base-image.sh#L1-L51) + +## 结论 +`alpine-base` 模块提供了一个优化的 Alpine Linux 基础镜像,适用于各种容器化应用。通过预装常用工具、配置中国镜像源、设置时区和创建非 root 用户,该镜像在功能性和安全性方面表现出色。镜像大小约为 50MB,适合轻量级应用。通过 `build-base-image.sh` 脚本,可以轻松构建、打标和推送镜像,确保了开发和部署的高效性。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/kami-gateway 模块/CI_CD集成.md b/.qoder/repowiki/zh/content/kami-gateway 模块/CI_CD集成.md new file mode 100644 index 0000000..4d18a0c --- /dev/null +++ b/.qoder/repowiki/zh/content/kami-gateway 模块/CI_CD集成.md @@ -0,0 +1,164 @@ +# CI/CD集成 + + +**Referenced Files in This Document** +- [README.md](file://kami-gateway/README.md) +- [build-base-image.sh](file://kami-gateway/build-base-image.sh) + + +## 目录 +1. [引言](#引言) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概述](#架构概述) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考量](#性能考量) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) + +## 引言 + +本文档系统性地描述了kami-gateway模块在Drone CI环境下的自动化构建与发布流程。重点说明CI配置如何监听kami-gateway目录变更,触发build-base-image.sh脚本执行,以及环境变量在CI流水线中的作用机制。通过分析自动化流程,展示其在提升构建效率和保障环境一致性方面的优势。 + +## 项目结构 + +kami-gateway模块包含构建基础Docker镜像所需的核心文件。项目结构设计清晰,将构建脚本、配置文件和源代码组织在独立目录中,便于CI/CD系统识别和处理变更。 + +```mermaid +graph TD +A[kami-gateway/] --> B[README.md] +A --> C[build-base-image.sh] +A --> D[go.mod] +A --> E[go.sum] +``` + +**Diagram sources** +- [README.md](file://kami-gateway/README.md) +- [build-base-image.sh](file://kami-gateway/build-base-image.sh) + +**Section sources** +- [README.md](file://kami-gateway/README.md) +- [build-base-image.sh](file://kami-gateway/build-base-image.sh) + +## 核心组件 + +kami-gateway的CI/CD流程围绕两个核心组件构建:`build-base-image.sh`构建脚本和`README.md`中的CI/CD说明文档。构建脚本负责执行具体的镜像构建、标记和推送操作,而文档则定义了CI系统的触发条件和工作流程。 + +**Section sources** +- [README.md](file://kami-gateway/README.md#L53-L60) +- [build-base-image.sh](file://kami-gateway/build-base-image.sh#L1-L51) + +## 架构概述 + +kami-gateway的CI/CD架构采用事件驱动模式,当kami-gateway目录发生变更时,Drone CI系统被触发,执行预定义的构建流水线。该流水线调用构建脚本,完成从代码到容器镜像的转换,并根据配置决定是否将镜像推送到远程仓库。 + +```mermaid +graph LR +A[代码仓库变更] --> B{Drone CI触发} +B --> C[执行build-base-image.sh] +C --> D[构建本地镜像] +D --> E{REGISTRY != localhost:5000?} +E --> |是| F[标记并推送镜像] +E --> |否| G[仅本地构建] +F --> H[通知完成] +G --> H +``` + +**Diagram sources** +- [README.md](file://kami-gateway/README.md#L53-L58) +- [build-base-image.sh](file://kami-gateway/build-base-image.sh#L26-L40) + +## 详细组件分析 + +### 构建脚本分析 + +`build-base-image.sh`脚本是自动化流程的核心执行单元,负责处理镜像的构建、标记和推送逻辑。 + +#### 环境变量注入与处理 +```mermaid +flowchart TD +Start([开始]) --> Config["配置环境变量"] +Config --> REGISTRY["REGISTRY = ${DOCKER_REGISTRY:-git.oceanpay.cc/danial}"] +Config --> VERSION["VERSION = ${VERSION:-latest}"] +REGISTRY --> Display["显示Registry: $REGISTRY"] +VERSION --> Display +Display --> Build["构建本地镜像"] +``` + +**Diagram sources** +- [build-base-image.sh](file://kami-gateway/build-base-image.sh#L9-L15) + +#### 条件推送逻辑 +```mermaid +flowchart TD +Check["检查REGISTRY值"] +Check --> Condition{"REGISTRY != localhost:5000?"} +Condition --> |真| Tag["标记远程镜像"] +Condition --> |假| SkipTag["跳过标记"] +Tag --> Push["推送镜像到仓库"] +SkipTag --> Complete["构建完成"] +Push --> Complete +``` + +**Diagram sources** +- [build-base-image.sh](file://kami-gateway/build-base-image.sh#L27-L30) +- [build-base-image.sh](file://kami-gateway/build-base-image.sh#L35-L39) + +**Section sources** +- [build-base-image.sh](file://kami-gateway/build-base-image.sh#L1-L51) + +### CI/CD流程说明 + +#### 流水线触发机制 +```mermaid +sequenceDiagram +participant Repo as 代码仓库 +participant Drone as Drone CI +participant Script as build-base-image.sh +Repo->>Drone : kami-gateway/目录变更 +Drone->>Drone : 检测到变更 +Drone->>Script : 执行构建脚本 +Script->>Script : 设置环境变量 +Script->>Script : 构建本地镜像 +Script->>Script : 条件性推送 +Script-->>Drone : 返回状态 +Drone-->>Repo : 更新构建状态 +``` + +**Diagram sources** +- [README.md](file://kami-gateway/README.md#L56) + +## 依赖分析 + +kami-gateway的CI/CD流程依赖于外部系统和环境配置,包括Drone CI平台、Docker运行时环境和镜像仓库服务。这些依赖关系确保了构建流程的完整性和可靠性。 + +```mermaid +graph TD +A[Drone CI] --> B[kami-gateway模块] +C[Docker Engine] --> B +D[镜像仓库] --> B +B --> E[应用部署] +``` + +**Diagram sources** +- [README.md](file://kami-gateway/README.md#L53) +- [build-base-image.sh](file://kami-gateway/build-base-image.sh#L35-L39) + +**Section sources** +- [README.md](file://kami-gateway/README.md#L53-L60) + +## 性能考量 + +kami-gateway的CI/CD流程设计注重效率和资源优化。通过条件构建机制,避免了不必要的镜像推送操作,特别是在本地测试环境中。基础镜像缓存和预下载依赖包的设计,显著缩短了构建时间,实现了10-30秒内的快速构建。 + +## 故障排除指南 + +当CI/CD流程出现问题时,应首先检查环境变量是否正确注入,特别是`DOCKER_REGISTRY`和`VERSION`。确认Drone CI是否正确检测到kami-gateway目录的变更,并验证构建脚本的执行权限。对于推送失败的情况,需检查网络连接和镜像仓库的访问凭证。 + +**Section sources** +- [build-base-image.sh](file://kami-gateway/build-base-image.sh#L26-L40) + +## 结论 + +kami-gateway模块的CI/CD集成通过自动化构建与发布流程,实现了高效的开发运维实践。Drone CI系统能够准确监听目录变更并触发构建,环境变量的灵活注入机制支持多环境部署,而条件推送逻辑则有效避免了本地测试时的无效操作。这一自动化流程不仅提升了构建效率,还保障了不同环境间的一致性,为持续交付提供了可靠的基础。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/kami-gateway 模块/Go依赖管理.md b/.qoder/repowiki/zh/content/kami-gateway 模块/Go依赖管理.md new file mode 100644 index 0000000..314a3a2 --- /dev/null +++ b/.qoder/repowiki/zh/content/kami-gateway 模块/Go依赖管理.md @@ -0,0 +1,85 @@ +# Go依赖管理 + + +**本文档引用文件** +- [go.mod](file://kami-gateway/go.mod) +- [go.sum](file://kami-gateway/go.sum) +- [Dockerfile.base](file://kami-gateway/Dockerfile.base) + + +## 目录 +1. [项目依赖声明](#项目依赖声明) +2. [间接依赖管理](#间接依赖管理) +3. [Docker构建优化机制](#docker构建优化机制) +4. [Go工具链版本一致性](#go工具链版本一致性) +5. [依赖更新与安全审计建议](#依赖更新与安全审计建议) + +## 项目依赖声明 + +kami-gateway模块通过`go.mod`文件明确声明了核心依赖,确保项目构建的可重复性和稳定性。主要依赖包括: + +- **Web框架**: `github.com/beego/beego/v2 v2.3.8`,提供MVC架构支持 +- **高性能JSON解析**: `github.com/bytedance/sonic v1.14.2`,显著提升序列化性能 +- **OpenTelemetry监控**: 包含`go.opentelemetry.io/otel`系列包,实现分布式追踪、指标和日志采集 +- **数据库驱动**: `github.com/go-sql-driver/mysql` 和 `github.com/redis/go-redis/v9` +- **HTTP客户端**: `github.com/go-resty/resty/v2`,简化外部服务调用 + +这些依赖通过`require`指令直接声明,版本号精确到补丁级别,确保开发、测试和生产环境的一致性。 + +**Section sources** +- [go.mod](file://kami-gateway/go.mod#L7-L39) + +## 间接依赖管理 + +`go.mod`文件中通过`require`块标记为`// indirect`的依赖项是间接依赖。这些依赖并非由项目直接导入,而是作为直接依赖的依赖被引入。例如: + +- `golang.org/x/crypto` 和 `golang.org/x/net`:被OpenTelemetry等库依赖 +- `github.com/cespare/xxhash/v2`:被`sonic`等高性能库使用 +- `google.golang.org/grpc`:被OTLP(OpenTelemetry Protocol)导出器依赖 + +Go模块系统自动解析并锁定这些间接依赖的版本,记录在`go.sum`文件中。`go.sum`不仅包含依赖模块的版本哈希,还包含其所有依赖的哈希,形成一个完整的依赖图校验链,有效防止依赖被篡改。 + +**Section sources** +- [go.mod](file://kami-gateway/go.mod#L41-L81) +- [go.sum](file://kami-gateway/go.sum#L1-L165) + +## Docker构建优化机制 + +`Dockerfile.base`中的指令是提升CI/CD效率的关键: + +```dockerfile +COPY --chown=appuser:appuser go.mod go.sum ./ +RUN go mod download && go mod verify +``` + +这两条指令的作用如下: + +1. **提前复制模块文件**: 在构建早期阶段就将`go.mod`和`go.sum`复制到镜像中。这利用了Docker的层缓存机制。 +2. **预下载并验证依赖**: `go mod download`会根据`go.mod`和`go.sum`下载所有声明的模块到`$GOPATH/pkg/mod`。`go mod verify`会校验下载的模块是否与`go.sum`中的哈希匹配,确保完整性。 +3. **缓存优势**: 只要`go.mod`或`go.sum`文件内容不变,Docker就会复用`go mod download`这一层的缓存。后续构建时,无需重新下载可能多达数百个的Go模块,从而将应用构建时间从几分钟缩短到十几秒。 +4. **CI/CD价值**: 在持续集成环境中,代码变更远比依赖变更频繁。此策略避免了每次构建都重复拉取网络依赖,极大地提升了构建速度,降低了对网络的依赖和失败风险。 + +**Section sources** +- [Dockerfile.base](file://kami-gateway/Dockerfile.base#L50-L54) + +## Go工具链版本一致性 + +`go.mod`文件中的`toolchain go1.24.6`指令是Go 1.24引入的重要特性,用于保障构建环境的一致性。 + +- **作用**: 该指令明确指定项目应使用Go 1.24.6版本的工具链进行构建。当开发者或CI系统使用`go build`命令时,如果本地Go版本不是1.24.6,Go命令行工具会自动下载并使用指定版本的工具链,而不是使用本地安装的版本。 +- **优势**: 彻底解决了“在我机器上能运行”的问题。无论开发者的本地环境如何,都能确保使用完全相同的编译器、链接器等工具进行构建,保证了二进制输出的可重现性,对于生产环境的稳定性至关重要。 + +**Section sources** +- [go.mod](file://kami-gateway/go.mod#L5) + +## 依赖更新与安全审计建议 + +为维护项目健康,建议遵循以下实践: + +1. **定期更新**: 使用`go get -u ./...`或`go get -u=patch ./...`定期更新依赖。更新后,`go.mod`和`go.sum`会自动更新。 +2. **安全审计**: 使用`govulncheck`工具(Go安全扫描工具)扫描项目,识别已知的漏洞。例如:`govulncheck ./...`。 +3. **审查变更**: 在更新依赖(尤其是主版本号变更)后,务必进行充分的测试,因为新版本可能包含破坏性变更。 +4. **最小化依赖**: 定期审查`go.mod`,移除不再使用的依赖,以减小攻击面和构建复杂性。 +5. **锁定版本**: 在生产项目中,始终使用精确的版本号,避免使用`latest`等不稳定的版本标识。 + +通过结合`go.mod`的精确版本控制、`toolchain`指令的构建一致性保障以及Docker的缓存优化,kami-gateway项目建立了一个高效、可靠且安全的依赖管理体系。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/kami-gateway 模块/kami-gateway 模块.md b/.qoder/repowiki/zh/content/kami-gateway 模块/kami-gateway 模块.md new file mode 100644 index 0000000..fd603ef --- /dev/null +++ b/.qoder/repowiki/zh/content/kami-gateway 模块/kami-gateway 模块.md @@ -0,0 +1,215 @@ +# kami-gateway 模块 + + +**本文档引用文件** +- [Dockerfile.base](file://kami-gateway/Dockerfile.base) +- [build-base-image.sh](file://kami-gateway/build-base-image.sh) +- [go.mod](file://kami-gateway/go.mod) +- [README.md](file://kami-gateway/README.md) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概述](#架构概述) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考量](#性能考量) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) + +## 简介 +kami-gateway 模块是一个为 Go 语言网关服务设计的基础镜像构建系统,旨在通过优化的 Docker 构建流程提升微服务架构下的开发与部署效率。该模块通过 `Dockerfile.base` 和 `build-base-image.sh` 脚本实现了一个高度可复用、安全且高效的构建环境。其核心设计理念是将 Go 编译环境、依赖预下载、中国镜像加速、非 root 用户安全运行等关键要素集成到一个基础镜像中,从而为上层应用提供极速构建能力。通过多阶段构建和 CI/CD 集成,该模块显著缩短了应用镜像的构建时间至 10-30 秒,是现代云原生微服务架构中的关键基础设施。 + +## 项目结构 +kami-gateway 模块的项目结构简洁明了,专注于基础镜像的构建与管理。其核心文件包括定义构建环境的 Dockerfile、自动化构建脚本、Go 依赖配置文件和说明文档。 + +```mermaid +graph TB +subgraph "kami-gateway/" +DockerfileBase[Dockerfile.base
基础镜像定义] +BuildScript[build-base-image.sh
构建脚本] +GoMod[go.mod
依赖管理] +Readme[README.md
使用说明] +end +DockerfileBase --> BuildScript : "被调用" +BuildScript --> GoMod : "读取依赖" +Readme --> DockerfileBase : "文档说明" +Readme --> BuildScript : "文档说明" +``` + +**Diagram sources** +- [Dockerfile.base](file://kami-gateway/Dockerfile.base#L1-L59) +- [build-base-image.sh](file://kami-gateway/build-base-image.sh#L1-L51) +- [go.mod](file://kami-gateway/go.mod#L1-L82) +- [README.md](file://kami-gateway/README.md#L1-L60) + +**Section sources** +- [Dockerfile.base](file://kami-gateway/Dockerfile.base#L1-L59) +- [build-base-image.sh](file://kami-gateway/build-base-image.sh#L1-L51) +- [go.mod](file://kami-gateway/go.mod#L1-L82) +- [README.md](file://kami-gateway/README.md#L1-L60) + +## 核心组件 +kami-gateway 模块的核心组件由三个关键文件构成:`Dockerfile.base` 定义了基础镜像的完整构建过程,`build-base-image.sh` 提供了自动化构建与推送的脚本逻辑,`go.mod` 则精确管理了所有 Go 语言依赖。这些组件协同工作,实现了从环境配置到镜像发布的完整流水线。`Dockerfile.base` 通过多阶段配置,确保了构建环境的纯净与最终镜像的轻量化;`build-base-image.sh` 利用环境变量实现了灵活的构建参数控制,支持自定义镜像仓库和版本;`go.mod` 文件中声明的依赖,如 beego、sonic 和 opentelemetry,为网关服务提供了高性能的 Web 框架、JSON 处理和可观测性支持。 + +**Section sources** +- [Dockerfile.base](file://kami-gateway/Dockerfile.base#L1-L59) +- [build-base-image.sh](file://kami-gateway/build-base-image.sh#L1-L51) +- [go.mod](file://kami-gateway/go.mod#L1-L82) + +## 架构概述 +kami-gateway 模块采用分层架构设计,将构建过程解耦为基础镜像构建和应用镜像构建两个独立阶段。基础镜像构建阶段是整个系统的核心,它一次性完成所有耗时操作,包括 Go 环境配置、系统依赖安装、时区与证书设置以及最关键的 Go 模块预下载。应用镜像构建阶段则基于此预构建的基础镜像,直接进行应用代码的编译和打包,从而实现了极速构建。 + +```mermaid +graph TD +subgraph "基础镜像构建阶段" +A[Dockerfile.base] --> B[使用 golang:1.25-alpine] +B --> C[配置环境变量
GO111MODULE=on
GOPROXY=https://goproxy.cn,direct] +C --> D[设置中国镜像源
Alpine & CA证书] +D --> E[创建非root用户 appuser] +E --> F[复制 go.mod/go.sum] +F --> G[执行 go mod download] +G --> H[生成 kami-gateway-base:latest] +end +subgraph "应用镜像构建阶段" +I[Dockerfile.improved] --> J[FROM kami-gateway-base:latest] +J --> K[复制源代码] +K --> L[执行 go build] +L --> M[生成最终应用镜像] +end +H --> J : "作为基础" +``` + +**Diagram sources** +- [Dockerfile.base](file://kami-gateway/Dockerfile.base#L4-L59) +- [README.md](file://kami-gateway/README.md#L8-L9) + +## 详细组件分析 + +### Dockerfile.base 分析 +`Dockerfile.base` 是 kami-gateway 基础镜像的蓝图,其设计体现了高度的优化和安全性。 + +#### 构建流程与安全配置 +```mermaid +flowchart TD +Start([开始]) --> BaseImage["FROM golang:1.25-alpine"] +BaseImage --> EnvConfig["配置环境变量
TZ, GO111MODULE, GOPROXY"] +EnvConfig --> MirrorConfig["配置中国镜像源
Alpine repositories"] +MirrorConfig --> InstallDeps["安装系统依赖
tzdata, curl, ca-certificates"] +InstallDeps --> Timezone["设置时区为 Asia/Shanghai"] +Timezone --> Certs["下载并安装自定义CA证书"] +Certs --> CreateUser["创建非root用户 appuser"] +CreateUser --> CreateAppDir["创建 /app 目录并授权"] +CreateUser --> SwitchUser["切换到 USER appuser"] +SwitchUser --> SetWorkdir["设置 WORKDIR /app"] +SetWorkdir --> CopyGoMod["复制 go.mod 和 go.sum"] +CopyGoMod --> PreDownload["RUN go mod download && go mod verify"] +PreDownload --> LabelImage["为镜像添加 LABEL 信息"] +LabelImage --> End([基础镜像构建完成]) +``` + +**Diagram sources** +- [Dockerfile.base](file://kami-gateway/Dockerfile.base#L4-L59) + +**Section sources** +- [Dockerfile.base](file://kami-gateway/Dockerfile.base#L1-L59) + +### build-base-image.sh 脚本分析 +`build-base-image.sh` 是一个 Bash 脚本,用于自动化执行基础镜像的构建、标记和推送流程。 + +#### 脚本执行流程 +```mermaid +sequenceDiagram +participant Terminal as "终端" +participant Script as "build-base-image.sh" +participant Docker as "Docker Engine" +Terminal->>Script : 执行 ./build-base-image.sh +Script->>Script : 设置环境变量
BASE_IMAGE_NAME, REGISTRY, VERSION +Script->>Script : 打印构建信息 +Script->>Docker : docker build --file Dockerfile.base
--tag kami-gateway-base : $VERSION
--tag kami-gateway-base : latest . +Docker-->>Script : 返回构建成功 +Script->>Script : 检查 REGISTRY 是否为 localhost +alt REGISTRY 不是 localhost +Script->>Docker : docker tag 本地镜像为远程仓库镜像 +Script->>Docker : docker push 推送镜像到远程仓库 +Docker-->>Script : 返回推送成功 +end +Script->>Script : 打印构建完成信息和镜像大小 +Script-->>Terminal : 脚本执行结束 +``` + +**Diagram sources** +- [build-base-image.sh](file://kami-gateway/build-base-image.sh#L1-L51) + +**Section sources** +- [build-base-image.sh](file://kami-gateway/build-base-image.sh#L1-L51) + +### go.mod 依赖管理分析 +`go.mod` 文件是 Go 项目依赖管理的核心,kami-gateway 模块在此文件中声明了构建网关服务所需的所有依赖。 + +#### 关键依赖及其作用 +| 依赖模块 | 版本 | 主要用途 | +| :--- | :--- | :--- | +| github.com/beego/beego/v2 | v2.3.8 | 高性能 Web 框架,用于构建 RESTful API | +| github.com/bytedance/sonic | v1.14.2 | 字节跳动开源的超快 JSON 序列化库 | +| go.opentelemetry.io/otel | v1.38.0 | OpenTelemetry SDK,提供分布式追踪和指标 | +| github.com/go-resty/resty/v2 | v2.16.5 | 简单易用的 HTTP 客户端 | +| github.com/redis/go-redis/v9 | v9.14.0 | Redis 客户端,用于缓存和会话管理 | +| go.uber.org/zap | v1.27.0 | 高性能日志库 | + +**Section sources** +- [go.mod](file://kami-gateway/go.mod#L1-L82) + +## 依赖分析 +kami-gateway 模块的依赖关系清晰,主要分为直接依赖和间接依赖。直接依赖在 `go.mod` 文件的 `require` 块中明确列出,是网关服务功能实现的基石。间接依赖(indirect)是这些直接依赖所依赖的库,由 Go 模块系统自动解析和管理。通过在 `Dockerfile.base` 中执行 `go mod download`,所有这些依赖(包括间接依赖)都会被预先下载到镜像的模块缓存中。这种预下载机制是实现极速构建的关键,它消除了每次构建应用时重复下载网络依赖的耗时过程。基础镜像与 `go.mod` 文件的版本绑定,确保了构建环境的一致性和可重现性。 + +```mermaid +erDiagram +DIRECT_DEPENDENCY ||--o{ INDIRECT_DEPENDENCY : "requires" +DIRECT_DEPENDENCY { +string module_name PK +string version +string purpose +} +INDIRECT_DEPENDENCY { +string module_name PK +string version +} +DIRECT_DEPENDENCY }|--|| BASE_IMAGE : "pre-downloaded in" +BASE_IMAGE { +string image_name PK +string tag +datetime build_time +} +``` + +**Diagram sources** +- [go.mod](file://kami-gateway/go.mod#L7-L82) +- [Dockerfile.base](file://kami-gateway/Dockerfile.base#L54) + +**Section sources** +- [go.mod](file://kami-gateway/go.mod#L1-L82) +- [Dockerfile.base](file://kami-gateway/Dockerfile.base#L54) + +## 性能考量 +kami-gateway 模块的设计在性能方面表现出色,主要体现在以下几个方面: +- **极速构建**:通过将耗时的依赖下载过程前置到基础镜像中,应用镜像的构建时间被压缩到 10-30 秒,极大地提升了开发迭代和 CI/CD 流水线的效率。 +- **镜像体积优化**:采用 Alpine Linux 作为基础操作系统,并结合多阶段构建(虽然在 `Dockerfile.base` 中未直接体现,但其为应用的多阶段构建提供了基础),最终生成的运行时镜像非常轻量,减少了存储和网络传输开销。 +- **网络效率**:通过配置 `GOPROXY=https://goproxy.cn,direct` 和使用阿里云的 Alpine 镜像源,显著加速了在中国大陆地区的依赖下载速度,避免了因网络问题导致的构建失败或延迟。 +- **资源复用**:基础镜像可以被多个基于 Go 的微服务共享,避免了为每个服务重复构建相同的环境,节省了计算资源和时间。 + +## 故障排除指南 +当使用 kami-gateway 模块时,可能会遇到以下常见问题及解决方案: +- **构建失败,提示无法访问 goproxy.cn**:检查构建环境的网络连接,确保可以访问 `https://goproxy.cn`。如果处于严格的企业防火墙后,可能需要联系网络管理员或临时调整 `GOPROXY` 环境变量。 +- **推送镜像到私有仓库失败**:确保已通过 `docker login` 命令登录到目标镜像仓库(由 `DOCKER_REGISTRY` 环境变量指定)。检查仓库地址和凭据是否正确。 +- **应用构建时出现依赖版本冲突**:确保应用的 `go.mod` 文件与基础镜像构建时使用的 `go.mod` 文件兼容。如果应用引入了新版本的依赖,可能需要重新构建基础镜像。 +- **容器运行时权限错误**:由于镜像以非 root 用户 `appuser` 运行,确保应用代码和数据目录的权限设置正确,避免尝试写入 `/` 等受保护的目录。 + +**Section sources** +- [Dockerfile.base](file://kami-gateway/Dockerfile.base#L37-L38) +- [build-base-image.sh](file://kami-gateway/build-base-image.sh#L10-L11) + +## 结论 +kami-gateway 模块通过精心设计的 `Dockerfile.base` 和 `build-base-image.sh` 脚本,成功构建了一个高效、安全、可复用的 Go 语言网关服务基础镜像。该模块通过预下载依赖、配置中国镜像源、创建非 root 用户等最佳实践,解决了传统 Go 应用 Docker 构建中的痛点,实现了 10-30 秒的极速构建。结合 `go.mod` 的精确依赖管理和 Drone CI 的自动化流程,kami-gateway 为微服务架构提供了一个稳定可靠的基础设施。开发者可以基于此基础镜像快速构建和部署应用,将精力集中在业务逻辑开发上,而非繁琐的环境配置,从而显著提升了开发效率和系统稳定性。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/kami-gateway 模块/基础镜像构建.md b/.qoder/repowiki/zh/content/kami-gateway 模块/基础镜像构建.md new file mode 100644 index 0000000..f02cb7a --- /dev/null +++ b/.qoder/repowiki/zh/content/kami-gateway 模块/基础镜像构建.md @@ -0,0 +1,177 @@ +# 基础镜像构建 + + +**Referenced Files in This Document** +- [Dockerfile.base](file://kami-gateway/Dockerfile.base) +- [build-base-image.sh](file://kami-gateway/build-base-image.sh) +- [README.md](file://kami-gateway/README.md) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概述](#架构概述) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) + +## 简介 +本文档详细阐述了 `kami-gateway` 项目中基础 Docker 镜像的构建机制。该机制通过 `Dockerfile.base` 和 `build-base-image.sh` 脚本实现,旨在创建一个安全、高效且适用于中国网络环境的 Go 应用基础镜像。文档将深入解析镜像构建过程中的关键配置,包括中国镜像源设置、时区配置、非 root 用户创建以及 Go 模块代理加速等最佳实践。 + +## 项目结构 +`kami-gateway` 目录下的文件组织清晰,专注于基础镜像的构建与管理。主要包含 Docker 配置文件、构建脚本和 Go 模块定义文件。 + +```mermaid +graph TB +kami-gateway[kami-gateway/] +--> Dockerfile_base[Dockerfile.base] +kami-gateway --> Dockerfile_improved[Dockerfile.improved] +kami-gateway --> build_script[build-base-image.sh] +kami-gateway --> go_mod[go.mod] +kami-gateway --> go_sum[go.sum] +kami-gateway --> README[README.md] +``` + +**Diagram sources** +- [Dockerfile.base](file://kami-gateway/Dockerfile.base) +- [build-base-image.sh](file://kami-gateway/build-base-image.sh) +- [README.md](file://kami-gateway/README.md) + +**Section sources** +- [Dockerfile.base](file://kami-gateway/Dockerfile.base) +- [build-base-image.sh](file://kami-gateway/build-base-image.sh) + +## 核心组件 +`kami-gateway` 基础镜像构建的核心组件是 `Dockerfile.base` 和 `build-base-image.sh`。前者定义了镜像的静态配置和构建步骤,后者则是一个可执行的脚本,用于自动化地调用 Docker 命令来构建、标记和推送镜像。这两个文件共同构成了一个可重复、可靠的镜像构建流程。 + +**Section sources** +- [Dockerfile.base](file://kami-gateway/Dockerfile.base#L1-L59) +- [build-base-image.sh](file://kami-gateway/build-base-image.sh#L1-L51) + +## 架构概述 +整个基础镜像构建流程遵循了多阶段配置和安全加固的最佳实践。首先,`Dockerfile.base` 从官方 `golang:1.25-alpine` 镜像出发,通过一系列 `RUN` 指令进行环境配置。随后,`build-base-image.sh` 脚本作为构建的入口,负责执行 `docker build` 命令,并根据环境变量决定是否将构建好的镜像推送到私有仓库。 + +```mermaid +graph LR +A[golang:1.25-alpine] --> B[Dockerfile.base] +B --> C[配置环境变量] +C --> D[设置中国镜像源] +D --> E[安装系统工具] +E --> F[创建非root用户] +F --> G[预下载Go依赖] +G --> H[生成基础镜像] +H --> I[build-base-image.sh] +I --> J[执行docker build] +J --> K[生成本地标签] +K --> L{是否推送?} +L --> |是| M[推送至私有仓库] +L --> |否| N[完成] +``` + +**Diagram sources** +- [Dockerfile.base](file://kami-gateway/Dockerfile.base#L4-L59) +- [build-base-image.sh](file://kami-gateway/build-base-image.sh#L20-L40) + +## 详细组件分析 + +### Dockerfile.base 分析 +`Dockerfile.base` 是构建基础镜像的蓝图,其设计体现了安全性和效率的平衡。 + +#### 环境变量与镜像源配置 +该文件通过 `ENV` 指令设置了关键的环境变量。`TZ=Asia/Shanghai` 确保了容器内的时间与北京时间一致。`GO111MODULE=on` 强制启用 Go Modules,保证依赖管理的现代性和一致性。`GOPROXY=https://goproxy.cn,direct` 将 Go 模块代理设置为中国的镜像服务,极大地加速了 `go mod download` 命令的执行速度,解决了从国外服务器下载依赖慢的问题。此外,`RUN` 指令将 Alpine Linux 的软件源替换为阿里云镜像,同样是为了提升 `apk` 包管理器的下载速度。 + +#### 安全加固与系统配置 +安全是此镜像的核心考量。`Dockerfile.base` 通过 `RUN` 指令安装了 `tzdata` 来支持时区设置,并安装了 `ca-certificates` 和自定义证书以确保 HTTPS 连接的安全性。最关键的一步是创建了一个非 root 用户 `appuser`(UID 1001)。通过 `addgroup` 和 `adduser` 命令创建用户后,使用 `USER appuser` 指令将后续所有操作的执行者切换为该普通用户。这遵循了最小权限原则,即使容器被攻破,攻击者也只能获得有限的权限,从而提升了整体安全性。 + +```mermaid +flowchart TD +Start([开始]) --> SetEnv["设置环境变量\nTZ, GO111MODULE, GOPROXY"] +SetEnv --> ConfigureMirror["配置中国镜像源\n阿里云 Alpine 镜像"] +ConfigureMirror --> InstallTools["安装系统工具\ntzdata, ca-certificates"] +InstallTools --> SetupTimezone["设置时区\nAsia/Shanghai"] +SetupTimezone --> CreateUser["创建非root用户\nappuser (UID 1001)"] +CreateUser --> SwitchUser["切换执行用户\nUSER appuser"] +SwitchUser --> DownloadDeps["预下载Go依赖\ngo mod download"] +DownloadDeps --> Finish([完成]) +``` + +**Diagram sources** +- [Dockerfile.base](file://kami-gateway/Dockerfile.base#L7-L54) + +**Section sources** +- [Dockerfile.base](file://kami-gateway/Dockerfile.base#L1-L59) + +### build-base-image.sh 脚本分析 +`build-base-image.sh` 脚本是构建流程的自动化驱动器,它封装了复杂的 Docker 命令,简化了构建操作。 + +#### 构建与标记逻辑 +脚本首先定义了基础镜像名称、版本号和镜像仓库地址(通过 `DOCKER_REGISTRY` 环境变量或默认值)。它使用 `docker build` 命令,通过 `--file` 参数指定 `Dockerfile.base`,并使用 `--tag` 参数同时为镜像打上版本化标签(如 `latest` 或指定版本)和 `latest` 标签。这种双标签策略既保证了可追溯性,又提供了最新的稳定版本。 + +#### 推送与输出逻辑 +脚本的核心智能在于条件推送。它通过判断 `REGISTRY` 变量是否为 `localhost:5000` 来决定是否执行推送操作。如果指定了私有仓库(如 `git.oceanpay.cc/danial`),脚本会先使用 `docker tag` 为本地镜像创建一个包含仓库地址的完整标签,然后调用 `docker push` 将其推送到远程仓库。构建完成后,脚本会输出成功信息,并使用 `docker images` 命令结合 `grep` 过滤,清晰地展示新构建的 `kami-gateway-base` 镜像的大小,便于开发者评估镜像优化效果。 + +```mermaid +sequenceDiagram +participant Terminal as "终端" +participant Script as "build-base-image.sh" +participant Docker as "Docker Engine" +Terminal->>Script : 执行 ./build-base-image.sh +Script->>Script : 设置环境变量 +Script->>Script : 输出构建信息 +Script->>Docker : docker build --file Dockerfile.base ... +Docker-->>Script : 构建成功 +Script->>Script : 检查 REGISTRY 是否为 localhost +alt 需要推送 +Script->>Docker : docker tag ... git.oceanpay.cc/danial/... +Script->>Docker : docker push git.oceanpay.cc/danial/... +Docker-->>Script : 推送成功 +end +Script->>Script : 输出镜像大小信息 +Script-->>Terminal : 构建完成 +``` + +**Diagram sources** +- [build-base-image.sh](file://kami-gateway/build-base-image.sh#L18-L51) + +**Section sources** +- [build-base-image.sh](file://kami-gateway/build-base-image.sh#L1-L51) + +## 依赖分析 +`kami-gateway` 基础镜像的构建依赖于外部的 Docker 环境和网络服务。其主要依赖关系如下: + +```mermaid +graph LR +A[build-base-image.sh] --> B[Docker CLI] +B --> C[Docker Daemon] +C --> D[golang:1.25-alpine] +D --> E[阿里云Alpine镜像] +A --> F[Go Proxy 中国镜像] +F --> G[goproxy.cn] +A --> H[私有镜像仓库] +H --> I[git.oceanpay.cc/danial] +``` + +**Diagram sources** +- [Dockerfile.base](file://kami-gateway/Dockerfile.base#L4-L16) +- [build-base-image.sh](file://kami-gateway/build-base-image.sh#L10-L30) + +## 性能考虑 +该构建机制在性能方面进行了精心优化。通过在 `Dockerfile.base` 中预下载 Go 依赖(`go mod download`),后续基于此基础镜像构建的应用镜像可以跳过耗时的依赖下载阶段,从而将构建时间从几分钟缩短到十秒左右。使用中国镜像源(阿里云和 goproxy.cn)显著减少了网络延迟,是提升构建速度的关键。多阶段构建和 `--no-cache` 选项的使用也确保了镜像的精简,减小了最终镜像的体积,有利于快速部署和传输。 + +## 故障排除指南 +当构建过程出现问题时,可参考以下步骤进行排查: +1. **网络问题**:确认构建环境可以访问阿里云镜像源(`mirrors.aliyun.com`)和 Go 代理(`goproxy.cn`)。若网络受限,可尝试更换为其他国内镜像。 +2. **权限问题**:检查 `build-base-image.sh` 脚本是否具有可执行权限(`chmod +x build-base-image.sh`)。 +3. **Docker 服务**:确保 Docker 服务正在运行。 +4. **私有仓库认证**:如果推送失败,确认已使用 `docker login git.oceanpay.cc` 登录到私有仓库。 +5. **证书问题**:如果出现 HTTPS 证书错误,检查 `Dockerfile.base` 中的 `curl` 命令是否能成功下载证书。 + +**Section sources** +- [Dockerfile.base](file://kami-gateway/Dockerfile.base#L33-L34) +- [build-base-image.sh](file://kami-gateway/build-base-image.sh#L35-L39) + +## 结论 +`kami-gateway` 的基础镜像构建方案是一个优秀的实践范例。它通过 `Dockerfile.base` 实现了环境的标准化和安全加固,利用 `build-base-image.sh` 脚本实现了构建流程的自动化和智能化。该方案不仅解决了中国开发者面临的网络瓶颈问题,还通过非 root 用户运行和预下载依赖等手段,兼顾了安全性与构建效率。这种多阶段、可复用的构建模式,为微服务架构下的持续集成与部署(CI/CD)提供了坚实的基础。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/kami-gateway 模块/改进型应用镜像.md b/.qoder/repowiki/zh/content/kami-gateway 模块/改进型应用镜像.md new file mode 100644 index 0000000..a97b757 --- /dev/null +++ b/.qoder/repowiki/zh/content/kami-gateway 模块/改进型应用镜像.md @@ -0,0 +1,140 @@ +# 改进型应用镜像 + + +**本文档引用文件** +- [Dockerfile.base](file://kami-gateway/Dockerfile.base) +- [build-base-image.sh](file://kami-gateway/build-base-image.sh) +- [README.md](file://kami-gateway/README.md) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概述](#架构概述) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考量](#性能考量) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) + +## 简介 +本文档全面介绍 `Dockerfile.improved` 的设计理念与实现细节,重点阐述其如何基于预构建的 `kami-gateway-base` 镜像实现极速应用打包。通过复用基础镜像中预下载的 Go 依赖和编译环境,仅需复制应用源码并执行 `go build` 即可生成二进制文件,将构建时间压缩至 10-30 秒。同时,文档解析多阶段构建策略在减小最终镜像体积方面的优势,以及非 root 用户运行的安全配置机制。 + +## 项目结构 +项目仓库包含多个子目录,分别对应不同的基础镜像构建方案。其中 `kami-gateway` 目录为核心分析对象,提供了 Go 应用的基础镜像构建能力。 + +```mermaid +graph TB +subgraph "基础镜像目录" +A[alpine-base] +B[kami-gateway] +C[kami-spider-monorepo] +end +B --> D[Dockerfile.base] +B --> E[build-base-image.sh] +B --> F[go.mod] +B --> G[go.sum] +``` + +**Diagram sources** +- [kami-gateway/Dockerfile.base](file://kami-gateway/Dockerfile.base#L1-L59) +- [kami-gateway/build-base-image.sh](file://kami-gateway/build-base-image.sh#L1-L51) + +**Section sources** +- [kami-gateway/Dockerfile.base](file://kami-gateway/Dockerfile.base#L1-L59) +- [kami-gateway/build-base-image.sh](file://kami-gateway/build-base-image.sh#L1-L51) + +## 核心组件 +`kami-gateway` 的核心组件包括 `Dockerfile.base` 和 `build-base-image.sh` 脚本。前者定义了包含 Go 1.25 编译环境和 Alpine 运行时的基础镜像,后者用于自动化构建并推送该镜像至私有注册中心。基础镜像通过预下载所有 Go 模块依赖,显著加速后续应用镜像的构建过程。 + +**Section sources** +- [kami-gateway/Dockerfile.base](file://kami-gateway/Dockerfile.base#L50-L55) +- [kami-gateway/build-base-image.sh](file://kami-gateway/build-base-image.sh#L1-L10) + +## 架构概述 +`kami-gateway-base` 镜像采用分层设计,底层基于 `golang:1.25-alpine`,逐层叠加中国镜像源、时区配置、证书更新、非 root 用户创建及 Go 依赖预下载。应用镜像通过 `FROM kami-gateway-base:latest` 继承此环境,实现“仅 COPY 源码 + go build”的极简构建流程。 + +```mermaid +graph TD +A[golang:1.25-alpine] --> B[配置环境变量] +B --> C[切换至阿里云镜像源] +C --> D[安装系统依赖] +D --> E[更新CA证书] +E --> F[创建非root用户appuser] +F --> G[设置工作目录/app] +G --> H[复制go.mod/go.sum] +H --> I[预下载Go依赖] +I --> J[kami-gateway-base:latest] +J --> K[应用镜像] +K --> L[COPY . .] +L --> M[go build] +M --> N[最终应用镜像] +``` + +**Diagram sources** +- [kami-gateway/Dockerfile.base](file://kami-gateway/Dockerfile.base#L4-L55) + +## 详细组件分析 + +### 基础镜像设计分析 +`Dockerfile.base` 通过一系列优化步骤构建高效的基础镜像。环境变量配置确保了 Go 模块代理指向国内镜像 `goproxy.cn`,并禁用 CGO 以生成静态二进制文件。Alpine 镜像源替换为阿里云镜像,极大提升包管理效率。 + +#### 环境与依赖配置流程 +```mermaid +flowchart TD +Start([开始]) --> SetEnv["设置环境变量
GO111MODULE=on
GOPROXY=https://goproxy.cn"] +SetEnv --> Mirror["配置Alpine镜像源
mirrors.aliyun.com"] +Mirror --> Install["安装系统依赖
tzdata, ca-certificates, git"] +Install --> Cert["下载并安装自定义CA证书"] +Cert --> User["创建非root用户appuser"] +User --> Workdir["设置工作目录 /app"] +Workdir --> CopyMod["复制go.mod和go.sum"] +CopyMod --> Download["执行go mod download"] +Download --> Verify["执行go mod verify"] +Verify --> Label["添加镜像标签"] +Label --> End([基础镜像构建完成]) +``` + +**Diagram sources** +- [kami-gateway/Dockerfile.base](file://kami-gateway/Dockerfile.base#L6-L59) + +**Section sources** +- [kami-gateway/Dockerfile.base](file://kami-gateway/Dockerfile.base#L6-L59) + +### 构建脚本分析 +`build-base-image.sh` 是一个 Bash 脚本,用于自动化构建和推送 `kami-gateway-base` 镜像。它支持通过环境变量自定义镜像名称、版本和目标注册中心,实现灵活的 CI/CD 集成。 + +**Section sources** +- [kami-gateway/build-base-image.sh](file://kami-gateway/build-base-image.sh#L1-L51) + +## 依赖分析 +`kami-gateway-base` 镜像的依赖分为两层:Docker 层依赖和 Go 模块层依赖。Docker 层依赖通过 `apk add` 安装必要的运行时工具,Go 模块层依赖通过 `go mod download` 在构建阶段预先拉取,避免每次应用构建时重复下载。 + +```mermaid +graph LR +A[kami-gateway-base] --> B[Alpine v3.22] +A --> C[Go 1.25] +A --> D[CA证书] +A --> E[Git] +A --> F[Go模块依赖] +F --> G[第三方库] +F --> H[项目私有模块] +``` + +**Diagram sources** +- [kami-gateway/Dockerfile.base](file://kami-gateway/Dockerfile.base#L19-L25) +- [kami-gateway/Dockerfile.base](file://kami-gateway/Dockerfile.base#L54) + +## 性能考量 +通过预构建 `kami-gateway-base` 镜像,将耗时的依赖下载和环境配置过程前置,使得应用镜像的构建时间从分钟级缩短至 10-30 秒。多阶段构建进一步优化最终镜像体积,仅包含运行时必要的二进制文件和配置,提升部署效率和安全性。 + +## 故障排除指南 +当基础镜像构建失败时,应首先检查网络连接,特别是对 `goproxy.cn` 和 `mirrors.aliyun.com` 的访问。若 `go mod download` 失败,可尝试清除 Go 模块缓存后重试。镜像推送失败通常与 Docker 注册中心认证或网络策略有关。 + +**Section sources** +- [kami-gateway/README.md](file://kami-gateway/README.md#L53-L60) +- [kami-gateway/build-base-image.sh](file://kami-gateway/build-base-image.sh#L35-L45) + +## 结论 +`kami-gateway-base` 镜像通过精心设计的分层结构和预构建策略,为 Go 应用提供了极速、安全、一致的构建基础。结合多阶段构建和非 root 用户运行,该方案在提升开发效率的同时,保障了生产环境的安全性与稳定性,是现代化容器化部署的理想选择。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/kami-spider-monorepo 模块/Playwright集成.md b/.qoder/repowiki/zh/content/kami-spider-monorepo 模块/Playwright集成.md new file mode 100644 index 0000000..a7571f3 --- /dev/null +++ b/.qoder/repowiki/zh/content/kami-spider-monorepo 模块/Playwright集成.md @@ -0,0 +1,224 @@ +# Playwright集成 + + +**本文档中引用的文件** +- [Dockerfile.base](file://kami-spider-monorepo/Dockerfile.base) +- [pyproject.toml](file://kami-spider-monorepo/pyproject.toml) +- [uv.lock](file://kami-spider-monorepo/uv.lock) +- [build-base-image.sh](file://kami-spider-monorepo/build-base-image.sh) +- [README.md](file://kami-spider-monorepo/README.md) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [系统级依赖详解](#系统级依赖详解) +4. [Chromium浏览器预下载机制](#chromium浏览器预下载机制) +5. [Playwright Python API使用示例](#playwright-python-api使用示例) +6. [环境变量控制安装行为](#环境变量控制安装行为) +7. [常见问题与解决方案](#常见问题与解决方案) +8. [构建与使用说明](#构建与使用说明) + +## 简介 +本文档详细说明了如何在Docker镜像中集成Playwright,实现开箱即用的浏览器自动化能力。重点涵盖系统依赖安装、Chromium浏览器预加载、Playwright API使用方法、环境变量控制以及常见问题处理。 + +## 项目结构 +`kami-spider-monorepo`目录包含构建Playwright集成Docker镜像所需的核心文件。该结构旨在提供一个完整、可复用的基础镜像,适用于需要浏览器自动化的爬虫服务。 + +```mermaid +graph TD +A[kami-spider-monorepo] --> B[Dockerfile.base] +A --> C[build-base-image.sh] +A --> D[pyproject.toml] +A --> E[uv.lock] +A --> F[README.md] +``` + +**图示来源** +- [Dockerfile.base](file://kami-spider-monorepo/Dockerfile.base#L1-L87) +- [pyproject.toml](file://kami-spider-monorepo/pyproject.toml#L1-L144) + +**本节来源** +- [README.md](file://kami-spider-monorepo/README.md#L1-L34) + +## 系统级依赖详解 +`Dockerfile.base`中通过`apt-get`安装了一系列系统级依赖库,这些库对于Chromium在无头Linux容器中稳定运行至关重要。 + +| 依赖包 | 用途说明 | +|--------|----------| +| `libnss3` | 网络安全服务库,支持HTTPS/TLS加密通信 | +| `libasound2` | ALSA音频支持库,防止因缺少音频设备导致的崩溃 | +| `libx11-6` | X11客户端库,提供基础的图形界面通信能力 | +| `libatk-bridge2.0-0` | 辅助技术工具包桥接,支持无障碍功能 | +| `libdrm2` | 直接渲染管理器库,支持GPU加速渲染 | +| `libxkbcommon0` | 键盘处理公共库,处理键盘布局和输入 | +| `libxcomposite1` | X复合扩展库,支持窗口合成 | +| `libxdamage1` | X损伤扩展库,用于检测屏幕变化 | +| `libxrandr2` | X随机访问内存库,管理显示分辨率 | +| `libgbm1` | 通用缓冲区管理库,支持GPU内存管理 | +| `libcups2t64` | 通用Unix打印系统库,防止打印相关错误 | +| `libxfixes3` | X修复扩展库,修复图形渲染问题 | +| `libcairo2` | 2D图形绘制库,支持矢量图形渲染 | +| `libpango-1.0-0` | 文本布局与渲染库,支持复杂文本显示 | + +这些依赖通过`playwright install-deps chromium`命令进一步验证和补充,确保Chromium所有运行时需求都被满足。 + +**本节来源** +- [Dockerfile.base](file://kami-spider-monorepo/Dockerfile.base#L17-L36) +- [Dockerfile.base](file://kami-spider-monorepo/Dockerfile.base#L69) + +## Chromium浏览器预下载机制 +为实现“开箱即用”的体验,Docker镜像在构建阶段即预下载并安装Chromium浏览器。 + +- **存储路径**:`/app/.browsers` +- **环境变量**:`PLAYWRIGHT_BROWSERS_PATH=/app/.browsers` +- **安装命令**:`/app/.venv/bin/playwright install chromium` +- **用户权限**:由非root用户`appuser`执行安装,确保运行时权限一致 +- **权限设置**:安装完成后,root用户将浏览器目录权限设为`755`,保证`appuser`可读写 + +此机制确保容器启动时无需额外下载浏览器,显著提升启动速度和稳定性。 + +```mermaid +sequenceDiagram +participant DockerBuild as Docker构建 +participant RootUser as Root用户 +participant AppUser as appuser用户 +participant Playwright as Playwright CLI +DockerBuild->>RootUser : 开始构建 +RootUser->>AppUser : 切换至appuser +AppUser->>Playwright : playwright install chromium +Playwright->>AppUser : 下载并安装Chromium到/app/.browsers +AppUser->>RootUser : 切换回root +RootUser->>RootUser : chmod -R 755 /app/.browsers +RootUser->>DockerBuild : 构建完成 +``` + +**图示来源** +- [Dockerfile.base](file://kami-spider-monorepo/Dockerfile.base#L10) +- [Dockerfile.base](file://kami-spider-monorepo/Dockerfile.base#L75-L82) + +**本节来源** +- [Dockerfile.base](file://kami-spider-monorepo/Dockerfile.base#L70-L76) + +## Playwright Python API使用示例 +以下代码展示了如何在容器内使用Playwright Python API进行浏览器自动化。 + +```python +from playwright.sync_api import sync_playwright +import os + +def main(): + with sync_playwright() as p: + # 启动Chromium浏览器 + browser = p.chromium.launch( + headless=True, + args=[ + '--no-sandbox', + '--disable-setuid-sandbox', + '--disable-dev-shm-usage', + '--disable-gpu' + ] + ) + + page = browser.new_page() + + # 拦截请求示例 + def intercept_request(route, request): + if request.resource_type in ["image", "stylesheet", "font"]: + route.abort() + else: + route.continue_() + + page.route("**/*", intercept_request) + + # 处理反爬检测 + page.add_init_script(""" + Object.defineProperty(navigator, 'webdriver', { + get: () => false, + }); + """) + + page.goto("https://example.com") + print(page.title()) + + browser.close() + +if __name__ == "__main__": + main() +``` + +**本节来源** +- [pyproject.toml](file://kami-spider-monorepo/pyproject.toml#L45) +- [uv.lock](file://kami-spider-monorepo/uv.lock#L1440-L1457) + +## 环境变量控制安装行为 +通过环境变量可灵活控制Docker镜像的构建和运行行为。 + +| 环境变量 | 作用 | 默认值 | 使用场景 | +|---------|------|--------|---------| +| `USE_PROXY` | 是否使用PyPI镜像代理 | 0 | 在网络受限环境中设为1 | +| `PLAYWRIGHT_BROWSERS_PATH` | 浏览器安装路径 | `/app/.browsers` | 自定义浏览器存储位置 | +| `UV_LINK_MODE` | UV包管理器链接模式 | copy | 控制依赖安装方式 | +| `PYDEVD_DISABLE` | 禁用PyDev调试器 | 1 | 生产环境禁用调试 | + +例如,使用代理构建镜像: +```bash +USE_PROXY=1 ./build-base-image.sh +``` + +**本节来源** +- [Dockerfile.base](file://kami-spider-monorepo/Dockerfile.base#L4-L14) +- [build-base-image.sh](file://kami-spider-monorepo/build-base-image.sh#L12) + +## 常见问题与解决方案 +### 问题:Browser closed unexpectedly +**原因**: +- 缺少系统依赖库 +- 权限问题 +- 内存不足 +- 未正确设置`--no-sandbox`等启动参数 + +**解决方案**: +1. 确保`Dockerfile.base`中所有系统依赖已安装 +2. 检查`/app/.browsers`目录权限为`755` +3. 增加容器内存限制 +4. 启动浏览器时添加必要参数: +```python +args=[ + '--no-sandbox', + '--disable-setuid-sandbox', + '--disable-dev-shm-usage', + '--disable-gpu' +] +``` + +### 问题:无法加载页面或超时 +**解决方案**: +- 检查网络连接 +- 增加超时时间 +- 使用`wait_for_load_state("networkidle")` +- 启用请求拦截减少资源加载 + +**本节来源** +- [Dockerfile.base](file://kami-spider-monorepo/Dockerfile.base#L17-L36) +- [Dockerfile.base](file://kami-spider-monorepo/Dockerfile.base#L81-L82) + +## 构建与使用说明 +使用提供的脚本可一键构建基础镜像: + +```bash +# 构建基础镜像 +./build-base-image.sh + +# 使用代理构建 +USE_PROXY=1 ./build-base-image.sh + +# 推送到私有镜像仓库 +DOCKER_REGISTRY=your-registry.com ./build-base-image.sh +``` + +构建完成后,镜像标记为`kami-spider-base:latest`,可直接用于部署需要Playwright的爬虫服务。 + +**本节来源** +- [build-base-image.sh](file://kami-spider-monorepo/build-base-image.sh#L1-L54) +- [README.md](file://kami-spider-monorepo/README.md#L12-L23) \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/kami-spider-monorepo 模块/kami-spider-monorepo 模块.md b/.qoder/repowiki/zh/content/kami-spider-monorepo 模块/kami-spider-monorepo 模块.md new file mode 100644 index 0000000..62d8c0a --- /dev/null +++ b/.qoder/repowiki/zh/content/kami-spider-monorepo 模块/kami-spider-monorepo 模块.md @@ -0,0 +1,177 @@ +# kami-spider-monorepo 模块 + + +**Referenced Files in This Document** +- [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) +- [README.md](file://kami-spider-monorepo/README.md) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概述](#架构概述) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) + +## 简介 +`kami-spider-monorepo` 模块是为Python爬虫平台设计的基础镜像构建系统,旨在提供一个开箱即用、功能完备的开发和运行环境。该模块通过Docker技术封装了Python 3.13运行时、UV包管理器、项目所需的所有Python依赖以及Playwright浏览器自动化框架,为爬虫应用的快速开发和部署提供了坚实的基础。其核心价值在于通过预配置和预安装,显著提升了开发效率和部署一致性,同时通过非root用户运行和确定性依赖管理增强了安全性与可靠性。 + +## 项目结构 +`kami-spider-monorepo` 模块的项目结构简洁明了,专注于基础镜像的构建。其核心文件包括用于定义镜像构建流程的 `Dockerfile.base`、用于自动化构建的 `build-base-image.sh` 脚本,以及用于管理Python依赖的 `pyproject.toml` 和 `uv.lock` 文件。这种结构将构建逻辑、依赖配置和环境定义清晰地分离,便于维护和理解。 + +```mermaid +graph TD +A[kami-spider-monorepo] --> B[Dockerfile.base] +A --> C[build-base-image.sh] +A --> D[pyproject.toml] +A --> E[uv.lock] +A --> F[README.md] +``` + +**Diagram sources** +- [Dockerfile.base](file://kami-spider-monorepo/Dockerfile.base) +- [build-base-image.sh](file://kami-spider-monorepo/build-base-image.sh) +- [pyproject.toml](file://kami-spider-monorepo/pyproject.toml) +- [uv.lock](file://kami-spider-monorepo/uv.lock) +- [README.md](file://kami-spider-monorepo/README.md) + +**Section sources** +- [README.md](file://kami-spider-monorepo/README.md) + +## 核心组件 +该模块的核心由四个关键文件构成:`Dockerfile.base` 定义了镜像的构建步骤和最终形态;`build-base-image.sh` 提供了可执行的构建命令,简化了镜像的创建过程;`pyproject.toml` 声明了项目所需的所有Python包及其版本范围;`uv.lock` 则精确锁定了所有依赖包的版本和哈希值,确保了构建的可重复性。这些组件协同工作,共同实现了从源码到可运行镜像的完整构建流程。 + +**Section sources** +- [Dockerfile.base](file://kami-spider-monorepo/Dockerfile.base) +- [build-base-image.sh](file://kami-spider-monorepo/build-base-image.sh) +- [pyproject.toml](file://kami-spider-monorepo/pyproject.toml) +- [uv.lock](file://kami-spider-monorepo/uv.lock) + +## 架构概述 +`kami-spider-monorepo` 模块的架构是一个典型的Docker镜像构建流水线。用户通过执行 `build-base-image.sh` 脚本来启动构建过程。该脚本会调用Docker命令,并根据环境变量(如 `USE_PROXY`)来决定是否使用代理。Docker引擎则根据 `Dockerfile.base` 的指令,从基础的 `python:3.13-slim` 镜像开始,逐步安装系统依赖、UV包管理器、Python依赖包,并最终完成Playwright浏览器的安装。整个过程确保了最终生成的 `kami-spider-base:latest` 镜像包含了所有必要的运行时环境。 + +```mermaid +sequenceDiagram +participant User as 开发者 +participant Script as build-base-image.sh +participant Docker as Docker引擎 +participant Dockerfile as Dockerfile.base +User->>Script : 执行 ./build-base-image.sh +Script->>Docker : docker build ... --build-arg USE_PROXY=... +Docker->>Dockerfile : 解析构建指令 +Dockerfile->>Docker : 安装系统依赖 (apt-get) +Dockerfile->>Docker : 复制并安装 UV 包管理器 +Dockerfile->>Docker : 创建非root用户 appuser +Dockerfile->>Docker : 复制 pyproject.toml 和 uv.lock +Dockerfile->>Docker : 使用 uv sync 安装 Python 依赖 +Dockerfile->>Docker : 安装 Playwright 系统依赖 +Dockerfile->>Docker : 安装 Chromium 浏览器 +Docker->>Script : 构建成功,生成镜像 +Script->>User : 显示构建完成信息 +``` + +**Diagram sources** +- [build-base-image.sh](file://kami-spider-monorepo/build-base-image.sh) +- [Dockerfile.base](file://kami-spider-monorepo/Dockerfile.base) + +## 详细组件分析 + +### Dockerfile.base 分析 +`Dockerfile.base` 是整个镜像构建的核心蓝图。它从一个轻量级的 `python:3.13-slim` 基础镜像开始,通过一系列精心设计的指令,构建出一个功能完备的爬虫运行环境。 + +#### 环境变量配置 +文件首先通过 `ENV` 指令设置了一系列关键的环境变量。`PYTHONUNBUFFERED=1` 确保Python的输出能够实时打印,便于调试;`PYTHONDONTWRITEBYTECODE=1` 禁止生成 `.pyc` 文件,以节省空间;`UV_COMPILE_BYTECODE=1` 则指示UV在安装包时编译字节码以提升运行时性能。`PATH` 变量被更新以包含虚拟环境的bin目录,确保命令可以直接执行。`PLAYWRIGHT_BROWSERS_PATH` 指定了浏览器的安装路径,实现了浏览器的集中管理。 + +#### 系统依赖安装 +`RUN apt-get update && apt-get install -y --no-install-recommends` 指令用于安装Playwright运行Chromium所必需的系统级库。这些库包括图形界面支持(如 `libx11`, `libatk-bridge2.0-0`)、音频支持(`libasound2`)、打印支持(`libcups2t64`)和字体支持(`fonts-liberation`)等。使用 `--no-install-recommends` 标志可以避免安装不必要的推荐包,从而减小镜像体积。 + +#### UV包管理器与非root用户安全配置 +镜像通过 `COPY --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/uv` 这一多阶段构建技巧,从官方镜像中复制了UV包管理器的二进制文件,确保了其来源的可靠性和版本的最新性。随后,Dockerfile创建了一个名为 `appuser` 的非root用户,并将工作目录 `/app` 及其子目录的所有权赋予该用户。这遵循了最小权限原则,极大地提升了容器运行时的安全性,即使应用存在漏洞,攻击者也难以获得主机的root权限。 + +#### 确定性依赖安装与Playwright集成 +依赖安装是通过 `uv sync` 命令完成的。该命令结合 `--frozen` 参数,会严格依据 `uv.lock` 文件中的锁定版本进行安装,从而保证了每次构建的依赖环境完全一致,实现了确定性构建。`Dockerfile.base` 巧妙地在 `root` 用户和 `appuser` 用户之间切换:先以 `appuser` 身份安装Python包,然后切换回 `root` 安装Playwright的系统依赖,最后再切换到 `appuser` 来安装Chromium浏览器本身。这种设计确保了所有操作都在正确的权限下执行,避免了权限错误。 + +```mermaid +flowchart TD +Start([开始构建]) --> BaseImage["FROM python:3.13-slim"] +BaseImage --> SetEnv["设置环境变量"] +SetEnv --> InstallSystem["安装系统依赖 (apt-get)"] +InstallSystem --> InstallUV["安装 UV 包管理器"] +InstallUV --> CreateUser["创建非root用户 appuser"] +CreateUser --> SwitchUser["切换到 appuser 用户"] +SwitchUser --> CopyDeps["复制 pyproject.toml 和 uv.lock"] +CopyDeps --> InstallPython["使用 uv sync 安装 Python 依赖"] +InstallPython --> SwitchRoot["切换回 root 用户"] +SwitchRoot --> InstallPlaywrightDeps["安装 Playwright 系统依赖"] +InstallPlaywrightDeps --> SwitchAppUser["切换到 appuser 用户"] +SwitchAppUser --> InstallBrowser["安装 Chromium 浏览器"] +InstallBrowser --> Finalize["最终化镜像 (权限、清理)"] +Finalize --> End([镜像构建完成]) +``` + +**Diagram sources** +- [Dockerfile.base](file://kami-spider-monorepo/Dockerfile.base) + +**Section sources** +- [Dockerfile.base](file://kami-spider-monorepo/Dockerfile.base) + +### 构建脚本分析 +`build-base-image.sh` 是一个Bash脚本,它封装了复杂的Docker构建命令,为开发者提供了简单易用的接口。脚本通过读取环境变量(如 `USE_PROXY`, `REGISTRY`, `VERSION`)来动态调整构建行为。例如,当 `USE_PROXY=1` 时,它会将代理设置传递给Docker构建过程,这对于在受限网络环境中构建镜像至关重要。脚本还负责为生成的镜像打上多个标签(包括版本号和 `latest`),并可选择性地将其推送到指定的镜像仓库。 + +**Section sources** +- [build-base-image.sh](file://kami-spider-monorepo/build-base-image.sh) + +### 依赖配置分析 +`pyproject.toml` 文件是项目的依赖声明中心,它明确列出了所有必需的Python包,如 `fastapi`, `sqlalchemy`, `playwright` 等。`uv.lock` 文件则是由UV工具生成的锁定文件,它不仅记录了每个包的确切版本,还包含了其来源、哈希值和所有传递性依赖。这两个文件共同作用,确保了依赖管理的透明性和可重复性。 + +**Section sources** +- [pyproject.toml](file://kami-spider-monorepo/pyproject.toml) +- [uv.lock](file://kami-spider-monorepo/uv.lock) + +## 依赖分析 +该模块的依赖关系清晰且高效。`build-base-image.sh` 脚本直接依赖于 `Dockerfile.base` 来执行构建。`Dockerfile.base` 则依赖于 `pyproject.toml` 和 `uv.lock` 来获取依赖信息,并依赖于 `uv` 二进制文件来执行安装。`uv.lock` 文件本身是由 `pyproject.toml` 中的依赖声明通过 `uv` 工具生成的。这种依赖链确保了构建过程的每个环节都有明确的输入和输出。 + +```mermaid +graph LR +A[build-base-image.sh] --> B[Dockerfile.base] +B --> C[pyproject.toml] +B --> D[uv.lock] +B --> E[uv binary] +C --> D +D --> E +``` + +**Diagram sources** +- [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) + +**Section sources** +- [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) + +## 性能考虑 +该模块在性能方面进行了多项优化。首先,使用 `python:3.13-slim` 作为基础镜像,从源头上减小了镜像体积。其次,在安装系统依赖时使用 `--no-install-recommends` 标志,并在安装后立即清理 `apt` 的缓存(`rm -rf /var/lib/apt/lists/*`),进一步减少了最终镜像的大小。使用UV包管理器而非pip,可以显著加快依赖安装速度。将浏览器安装在 `/app/.browsers` 目录下,便于在不同应用间共享,避免了重复下载。 + +## 故障排除指南 +* **构建失败:** 检查 `pyproject.toml` 和 `uv.lock` 文件是否同步。如果依赖有更新,请在宿主机上运行 `uv lock` 命令重新生成 `uv.lock` 文件。 +* **网络问题:** 在无法访问PyPI的环境中,确保在执行 `build-base-image.sh` 时设置了 `USE_PROXY=1` 环境变量。 +* **权限错误:** 确保 `Dockerfile.base` 中的用户切换逻辑正确。Playwright的浏览器必须由运行应用的同一用户(`appuser`)来安装。 +* **浏览器启动失败:** 检查容器内是否缺少必要的系统库。可以参考 `Dockerfile.base` 中的 `apt-get install` 命令,确认所有Playwright依赖都已安装。 + +**Section sources** +- [Dockerfile.base](file://kami-spider-monorepo/Dockerfile.base) +- [build-base-image.sh](file://kami-spider-monorepo/build-base-image.sh) + +## 结论 +`kami-spider-monorepo` 模块通过精心设计的Dockerfile和构建脚本,成功地为Python爬虫应用创建了一个强大、安全且高效的开发基础。它通过集成Python 3.13、UV包管理器、清华源代理支持、确定性依赖管理和开箱即用的Playwright浏览器,极大地简化了开发者的环境配置工作。该模块不仅提升了构建效率,还通过非root用户运行和标准化的依赖管理,为应用的稳定性和安全性提供了保障,是构建现代化爬虫应用的理想起点。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/kami-spider-monorepo 模块/依赖管理.md b/.qoder/repowiki/zh/content/kami-spider-monorepo 模块/依赖管理.md new file mode 100644 index 0000000..f0c0d54 --- /dev/null +++ b/.qoder/repowiki/zh/content/kami-spider-monorepo 模块/依赖管理.md @@ -0,0 +1,71 @@ +# 依赖管理 + + +**本文档引用的文件** +- [pyproject.toml](file://kami-spider-monorepo/pyproject.toml) +- [uv.lock](file://kami-spider-monorepo/uv.lock) +- [Dockerfile.base](file://kami-spider-monorepo/Dockerfile.base) +- [build-base-image.sh](file://kami-spider-monorepo/build-base-image.sh) + + +## 目录 +1. [依赖管理机制](#依赖管理机制) +2. [依赖安装流程](#依赖安装流程) +3. [Docker 构建优化](#docker-构建优化) +4. [依赖更新流程](#依赖更新流程) + +## 依赖管理机制 + +本项目采用 `pyproject.toml` 和 `uv.lock` 文件协同管理 Python 依赖,确保依赖安装的确定性和可重复性。`pyproject.toml` 定义了项目所需的直接依赖及其版本范围,而 `uv.lock` 文件则通过锁定所有依赖(包括传递依赖)的确切版本和哈希值,实现了跨环境的完全一致性。 + +项目选择 `uv` 作为包管理器替代传统的 `pip`,主要基于其卓越的性能优势。`uv` 采用 Rust 编写,通过并行下载和安装、预编译二进制文件(wheels)的优先使用以及高效的解析算法,显著提升了依赖安装速度。在安装如 FastAPI、SQLAlchemy 和 Playwright 等包含大量依赖或大型二进制文件的复杂库时,`uv` 的安装速度相比 `pip` 可提升数倍,极大地优化了开发和构建流程。 + +**Section sources** +- [pyproject.toml](file://kami-spider-monorepo/pyproject.toml#L1-L144) +- [uv.lock](file://kami-spider-monorepo/uv.lock#L1-L647) + +## 依赖安装流程 + +在 Docker 构建过程中,`uv.lock` 文件是确保环境一致性的核心。`Dockerfile.base` 利用 `uv sync` 命令,严格依据 `uv.lock` 文件中锁定的版本进行依赖安装。此过程通过 `--frozen` 参数确保不会发生任何版本升级,从而保证了无论在何种构建环境中,最终安装的依赖包集合都是完全相同的。 + +```mermaid +flowchart TD +A[开始] --> B[复制 pyproject.toml 和 uv.lock] +B --> C{USE_PROXY 环境变量} +C --> |是| D[使用清华源镜像] +C --> |否| E[使用默认 PyPI 源] +D --> F[执行 uv sync --frozen] +E --> F +F --> G[安装 Playwright 浏览器] +G --> H[完成] +``` + +**Diagram sources** +- [Dockerfile.base](file://kami-spider-monorepo/Dockerfile.base#L55-L64) +- [Dockerfile.base](file://kami-spider-monorepo/Dockerfile.base#L75-L76) + +**Section sources** +- [Dockerfile.base](file://kami-spider-monorepo/Dockerfile.base#L55-L64) +- [Dockerfile.base](file://kami-spider-monorepo/Dockerfile.base#L75-L76) + +## Docker 构建优化 + +`Dockerfile.base` 实现了多项优化策略以提升构建效率和镜像质量。首先,采用了分层缓存策略:将依赖文件的复制与安装作为一个独立的构建阶段,利用 Docker 的层缓存机制。当 `pyproject.toml` 或 `uv.lock` 未发生变化时,该阶段可直接使用缓存,避免了重复下载和安装依赖,大幅缩短了后续构建时间。 + +其次,通过合并安装命令优化了镜像层数。系统依赖(如 Playwright 运行时库)的安装被合并到一个 `RUN` 指令中,并在命令末尾执行 `rm -rf /var/lib/apt/lists/*` 清理临时文件,这不仅减少了镜像层数,也减小了最终镜像的体积。此外,构建过程遵循最小权限原则,创建了非 root 用户 `appuser` 来安装和运行应用,增强了容器的安全性。 + +**Section sources** +- [Dockerfile.base](file://kami-spider-monorepo/Dockerfile.base#L17-L36) +- [Dockerfile.base](file://kami-spider-monorepo/Dockerfile.base#L41-L46) +- [Dockerfile.base](file://kami-spider-monorepo/Dockerfile.base#L48-L49) + +## 依赖更新流程 + +更新 Python 依赖的标准流程如下:首先,修改 `pyproject.toml` 文件中的依赖项或版本号。然后,在项目根目录下执行 `uv update` 或 `uv sync` 命令,该命令会根据新的 `pyproject.toml` 重新解析依赖关系,并生成更新后的 `uv.lock` 文件。最后,提交更新后的 `pyproject.toml` 和 `uv.lock` 文件。 + +为验证新镜像的功能完整性,应执行 `build-base-image.sh` 脚本重新构建基础镜像。构建成功后,可通过运行集成测试或启动应用进行手动验证,确保新版本的依赖未引入任何兼容性问题或功能缺陷。 + +**Section sources** +- [pyproject.toml](file://kami-spider-monorepo/pyproject.toml#L1-L144) +- [build-base-image.sh](file://kami-spider-monorepo/build-base-image.sh#L1-L54) +- [Dockerfile.base](file://kami-spider-monorepo/Dockerfile.base#L1-L87) \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/kami-spider-monorepo 模块/功能特性.md b/.qoder/repowiki/zh/content/kami-spider-monorepo 模块/功能特性.md new file mode 100644 index 0000000..b9225d6 --- /dev/null +++ b/.qoder/repowiki/zh/content/kami-spider-monorepo 模块/功能特性.md @@ -0,0 +1,81 @@ +# 功能特性 + + +**本文档引用的文件** +- [README.md](file://kami-spider-monorepo/README.md) +- [Dockerfile.base](file://kami-spider-monorepo/Dockerfile.base) +- [build-base-image.sh](file://kami-spider-monorepo/build-base-image.sh) +- [pyproject.toml](file://kami-spider-monorepo/pyproject.toml) +- [uv.lock](file://kami-spider-monorepo/uv.lock) + + +## 目录 +1. [引言](#引言) +2. [核心功能组件](#核心功能组件) +3. [Python 3.13与UV包管理器集成](#python-313与uv包管理器集成) +4. [Playwright自动化框架与Chromium浏览器](#playwright自动化框架与chromium浏览器) +5. [国内网络环境优化机制](#国内网络环境优化机制) +6. [安全运行策略](#安全运行策略) +7. [实际应用场景优势](#实际应用场景优势) +8. [与通用Python镜像对比分析](#与通用python镜像对比分析) +9. [构建与使用方法](#构建与使用方法) + +## 引言 +kami-spider-monorepo模块提供了一个专为Python爬虫应用优化的基础Docker镜像,旨在解决复杂网页抓取、反爬虫绕过和高并发请求等挑战。该镜像集成了最新的Python 3.13运行时、高效的UV包管理器以及完整的Playwright自动化框架,特别针对中国网络环境进行了优化,包括配置了清华源加速机制和自定义证书支持。通过预装Chromium浏览器和非root用户安全策略,该镜像不仅提升了依赖安装效率和运行安全性,还为处理JavaScript渲染页面和动态内容抓取提供了强大支持。 + +## 核心功能组件 +kami-spider基础镜像通过精心设计的组件集成,为爬虫应用提供了完整的运行环境。镜像基于`python:3.13-slim`构建,确保了Python 3.13的最新特性和性能优化。UV包管理器被集成用于快速、确定性的依赖安装,显著缩短了构建时间。Playwright框架及其运行时库被完整安装,支持对复杂动态页面的自动化操作。所有项目所需的Python依赖包都已预先安装,包括用于网络请求的`httpx`、`curl-cffi`,用于数据解析的`beautifulsoup4`、`lxml`,以及用于验证码识别的`ddddocr`等。此外,镜像还配置了非root用户`appuser`,增强了生产环境下的安全性。 + +**本文档引用的文件** +- [README.md](file://kami-spider-monorepo/README.md) +- [Dockerfile.base](file://kami-spider-monorepo/Dockerfile.base) +- [pyproject.toml](file://kami-spider-monorepo/pyproject.toml) + +## Python 3.13与UV包管理器集成 +该镜像的核心是Python 3.13运行时环境,它为爬虫应用提供了最新的语言特性和性能改进。为了优化依赖管理,镜像集成了UV包管理器,这是一个用Rust编写的超高速Python包安装工具。UV通过`COPY --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/uv`指令被安装到镜像中,确保了其可用性。在构建过程中,UV利用`uv sync`命令根据`uv.lock`文件精确安装所有依赖,保证了环境的一致性和可重复性。与传统的`pip`相比,UV的安装速度显著提升,特别是在处理大量依赖时,这极大地缩短了Docker镜像的构建时间。 + +**本文档引用的文件** +- [Dockerfile.base](file://kami-spider-monorepo/Dockerfile.base) +- [pyproject.toml](file://kami-spider-monorepo/pyproject.toml) +- [uv.lock](file://kami-spider-monorepo/uv.lock) + +## Playwright自动化框架与Chromium浏览器 +为了应对现代网站广泛使用的JavaScript动态渲染,该镜像深度集成了Playwright自动化框架。在Dockerfile中,通过`RUN /app/.venv/bin/playwright install-deps chromium`和`RUN /app/.venv/bin/playwright install chromium`指令,系统级依赖和Chromium浏览器本身被安装到镜像中。这使得爬虫能够模拟真实用户行为,如页面导航、表单填写、点击操作和等待动态内容加载,从而有效抓取由JavaScript生成的内容。Playwright的API提供了对浏览器上下文、页面和元素的精细控制,是绕过复杂反爬虫机制的关键工具。 + +**本文档引用的文件** +- [Dockerfile.base](file://kami-spider-monorepo/Dockerfile.base) +- [pyproject.toml](file://kami-spider-monorepo/pyproject.toml) + +## 国内网络环境优化机制 +考虑到国内开发者面临的网络挑战,该镜像内置了针对中国网络环境的优化机制。通过在构建脚本中设置`USE_PROXY`环境变量,镜像构建过程可以智能地选择是否使用代理。当`USE_PROXY=1`时,`uv sync`命令会使用`--index-url https://pypi.tuna.tsinghua.edu.cn/simple/`参数,将包索引源切换到清华大学的镜像站。这一机制显著加速了依赖包的下载速度,解决了从官方PyPI源下载缓慢或不稳定的问题。此外,镜像还预装了必要的系统证书,确保了与国内HTTPS服务的安全通信。 + +**本文档引用的文件** +- [Dockerfile.base](file://kami-spider-monorepo/Dockerfile.base) +- [build-base-image.sh](file://kami-spider-monorepo/build-base-image.sh) + +## 安全运行策略 +安全性是生产环境部署的关键考量。该镜像遵循最小权限原则,创建了一个名为`appuser`的非root用户。在Dockerfile中,通过`RUN groupadd -r appuser && useradd -r -g appuser -d /home/appuser -m appuser`指令创建该用户,并通过`USER appuser`指令在后续步骤中以该用户身份运行。这种策略有效降低了因应用漏洞导致的系统级安全风险。即使爬虫应用被攻破,攻击者也只能在`appuser`的权限范围内活动,无法对宿主系统造成严重破坏,从而提升了整体部署的安全性。 + +**本文档引用的文件** +- [Dockerfile.base](file://kami-spider-monorepo/Dockerfile.base) + +## 实际应用场景优势 +该镜像在处理复杂爬虫任务时展现出显著优势。对于需要JavaScript渲染的单页应用(SPA),Playwright可以完美模拟浏览器行为,获取动态加载的数据。在反爬虫绕过方面,结合`fake-useragent`生成随机User-Agent、`curl-cffi`模拟真实浏览器指纹以及Playwright的自动化操作,可以有效应对基于行为分析的反爬机制。在高并发请求场景下,`aiofiles`和`aiomysql`等异步库与`gunicorn`和`uvicorn`的结合,确保了应用的高吞吐量和低延迟。此外,`apscheduler`提供了强大的定时任务调度能力,适用于周期性数据抓取任务。 + +**本文档引用的文件** +- [pyproject.toml](file://kami-spider-monorepo/pyproject.toml) +- [uv.lock](file://kami-spider-monorepo/uv.lock) + +## 与通用Python镜像对比分析 +相较于标准的`python:3.13-slim`等通用镜像,kami-spider基础镜像体现了专为爬虫优化的设计理念。通用镜像仅提供Python运行时,开发者需要自行安装所有依赖和工具,过程繁琐且易出错。而kami-spider镜像开箱即用,预装了爬虫所需的所有核心组件,极大地简化了开发和部署流程。在性能上,UV包管理器比`pip`快数倍;在功能性上,集成的Playwright和Chromium省去了复杂的环境配置;在安全性上,非root用户策略是通用镜像通常不具备的。这种一体化的设计,使得kami-spider镜像成为构建高效、稳定爬虫应用的理想选择。 + +**本文档引用的文件** +- [Dockerfile.base](file://kami-spider-monorepo/Dockerfile.base) +- [pyproject.toml](file://kami-spider-monorepo/pyproject.toml) + +## 构建与使用方法 +构建该基础镜像非常简单,只需在`kami-spider-monorepo`目录下运行`./build-base-image.sh`脚本。如果需要使用代理加速国内网络,可以执行`USE_PROXY=1 ./build-base-image.sh`。构建完成后,镜像将被标记为`kami-spider-base:latest`。用户可以在自己的Dockerfile中通过`FROM kami-spider-base:latest`来继承此基础镜像,从而快速启动爬虫应用的开发。整个构建过程自动化,确保了环境的一致性和可重复性。 + +**本文档引用的文件** +- [build-base-image.sh](file://kami-spider-monorepo/build-base-image.sh) +- [README.md](file://kami-spider-monorepo/README.md) \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/kami-spider-monorepo 模块/构建与使用.md b/.qoder/repowiki/zh/content/kami-spider-monorepo 模块/构建与使用.md new file mode 100644 index 0000000..3efa166 --- /dev/null +++ b/.qoder/repowiki/zh/content/kami-spider-monorepo 模块/构建与使用.md @@ -0,0 +1,210 @@ +# 构建与使用 + + +**Referenced Files in This Document** +- [build-base-image.sh](file://kami-spider-monorepo/build-base-image.sh) +- [Dockerfile.base](file://kami-spider-monorepo/Dockerfile.base) +- [README.md](file://kami-spider-monorepo/README.md) +- [build-base-image.sh](file://alpine-base/build-base-image.sh) +- [Dockerfile.base](file://alpine-base/Dockerfile.base) +- [README.md](file://alpine-base/README.md) + + +## 目录 +1. [简介](#简介) +2. [前置条件与环境准备](#前置条件与环境准备) +3. [构建脚本详解](#构建脚本详解) +4. [环境变量配置](#环境变量配置) +5. [镜像构建与推送流程](#镜像构建与推送流程) +6. [基础镜像使用指南](#基础镜像使用指南) +7. [输出信息解析](#输出信息解析) +8. [常见问题排查](#常见问题排查) + +## 简介 +本文档详细说明如何构建和使用 `kami-spider-base` 基础 Docker 镜像。该镜像为爬虫应用提供完整的运行时环境,包含 Python 3.13、UV 包管理器、所有项目依赖以及 Playwright 浏览器。通过本指南,开发者可以了解构建脚本的工作原理、配置选项以及如何在实际项目中引用此基础镜像。 + +**Section sources** +- [README.md](file://kami-spider-monorepo/README.md#L1-L34) + +## 前置条件与环境准备 +在执行构建脚本之前,请确保本地开发环境满足以下条件: + +- **Docker 引擎**:已安装并运行 Docker 服务 +- **工作目录**:位于 `kami-spider-monorepo` 项目根目录 +- **网络连接**:能够访问外部包仓库(或配置代理) +- **权限配置**:当前用户具有执行脚本和调用 Docker 命令的权限 + +推荐使用 Linux 或 macOS 系统进行构建。Windows 用户建议使用 WSL2 环境以获得最佳兼容性。 + +**Section sources** +- [build-base-image.sh](file://kami-spider-monorepo/build-base-image.sh#L1-L54) + +## 构建脚本详解 +`build-base-image.sh` 脚本是构建 `kami-spider-base` 镜像的核心工具,其执行流程如下: + +1. **初始化配置**:读取环境变量并设置默认值 +2. **镜像构建**:调用 `docker build` 命令,基于 `Dockerfile.base` 创建镜像 +3. **标签处理**:为镜像添加版本标签和 latest 标签 +4. **注册表推送**:当指定非本地注册表时,推送镜像到远程仓库 +5. **结果展示**:输出构建完成信息和镜像大小统计 + +脚本通过 `set -e` 确保任何步骤失败时立即终止,保证构建过程的可靠性。 + +```mermaid +flowchart TD +A[开始构建] --> B[读取环境变量] +B --> C[执行Docker构建] +C --> D[生成镜像标签] +D --> E{是否推送?} +E --> |是| F[推送至注册表] +E --> |否| G[跳过推送] +F --> H[显示构建结果] +G --> H +H --> I[结束] +``` + +**Diagram sources** +- [build-base-image.sh](file://kami-spider-monorepo/build-base-image.sh#L1-L54) + +**Section sources** +- [build-base-image.sh](file://kami-spider-monorepo/build-base-image.sh#L1-L54) + +## 环境变量配置 +构建脚本支持以下环境变量来自定义构建行为: + +**: DOCKER_REGISTRY** +- **作用**:指定目标镜像注册表地址 +- **默认值**:`localhost:5000` +- **示例**:`DOCKER_REGISTRY=git.oceanpay.cc/danial` + +**: VERSION** +- **作用**:设置镜像版本标签 +- **默认值**:`latest` +- **示例**:`VERSION=1.2.0` + +**: USE_PROXY** +- **作用**:启用国内镜像源代理 +- **默认值**:`0`(禁用) +- **有效值**:`0` 或 `1` +- **功能**:当值为 `1` 时,使用清华源加速 Python 包下载 + +这些变量采用 `${VARNAME:-default}` 语法,允许用户覆盖默认值而不影响全局环境。 + +**Section sources** +- [build-base-image.sh](file://kami-spider-monorepo/build-base-image.sh#L8-L12) + +## 镜像构建与推送流程 +### 构建命令示例 +```bash +# 基本构建(使用本地注册表) +./build-base-image.sh + +# 使用代理构建 +USE_PROXY=1 ./build-base-image.sh + +# 推送到私有注册表 +DOCKER_REGISTRY=git.oceanpay.cc/danial ./build-base-image.sh + +# 指定版本并推送 +DOCKER_REGISTRY=git.oceanpay.cc/danial VERSION=1.0.0 ./build-base-image.sh +``` + +### 推送逻辑说明 +脚本通过比较 `REGISTRY` 变量与 `localhost:5000` 来决定是否执行推送操作: +- 当 `REGISTRY` 为 `localhost:5000` 时,仅在本地构建镜像 +- 当 `REGISTRY` 为其他值时,自动执行 `docker tag` 和 `docker push` 操作 + +此设计避免了向本地测试注册表不必要的推送操作,提高开发效率。 + +**Section sources** +- [build-base-image.sh](file://kami-spider-monorepo/build-base-image.sh#L26-L43) + +## 基础镜像使用指南 +在实际爬虫项目的 `Dockerfile` 中,可通过以下方式引用 `kami-spider-base` 镜像: + +```dockerfile +# 使用基础镜像 +FROM git.oceanpay.cc/danial/kami-spider-base:latest + +# 复制应用代码 +COPY --chown=appuser:appuser . /app/ + +# 切换到非 root 用户 +USER appuser + +# 设置工作目录 +WORKDIR /app + +# 运行应用 +CMD ["python", "main.py"] +``` + +基础镜像已预装所有依赖,包括: +- Python 3.13 运行时 +- UV 包管理器 +- Playwright 及其系统依赖 +- Chromium 浏览器 +- 非 root 用户 `appuser` + +这使得应用 Dockerfile 可以保持极简,专注于业务逻辑。 + +**Section sources** +- [Dockerfile.base](file://kami-spider-monorepo/Dockerfile.base#L1-L87) +- [README.md](file://kami-spider-monorepo/README.md#L25-L32) + +## 输出信息解析 +构建成功后,脚本会输出以下关键信息: + +**: 构建状态** +- `✅ Combined base image built successfully!`:表示镜像构建成功 +- `✅ Image pushed to registry successfully!`:表示推送成功 + +**: 可用镜像** +列出本地生成的镜像标签,通常包含版本标签和 latest 标签。 + +**: 镜像大小** +通过 `docker images` 命令显示镜像大小,格式为表格: +``` +REPOSITORY TAG SIZE +kami-spider-base latest 1.2GB +``` + +镜像大小约为 1.2GB,主要由以下部分构成: +- Python 运行时:~100MB +- 系统依赖库:~300MB +- Python 第三方包:~200MB +- Chromium 浏览器:~600MB + +**Section sources** +- [build-base-image.sh](file://kami-spider-monorepo/build-base-image.sh#L45-L54) + +## 常见问题排查 +### 问题1:构建失败,提示网络超时 +**可能原因**:无法访问外部包仓库 +**解决方案**: +- 启用代理:`USE_PROXY=1 ./build-base-image.sh` +- 检查网络连接和防火墙设置 + +### 问题2:推送失败,认证错误 +**可能原因**:未登录目标注册表 +**解决方案**: +```bash +# 登录私有注册表 +docker login git.oceanpay.cc +``` + +### 问题3:权限错误 +**可能原因**:Docker 服务未运行或用户无权限 +**解决方案**: +- 启动 Docker 服务 +- 将用户添加到 docker 组:`sudo usermod -aG docker $USER` + +### 问题4:磁盘空间不足 +**可能原因**:Chromium 浏览器占用大量空间 +**解决方案**: +- 清理 Docker 缓存:`docker system prune` +- 确保至少有 2GB 可用磁盘空间 + +**Section sources** +- [build-base-image.sh](file://kami-spider-monorepo/build-base-image.sh#L6-L54) +- [Dockerfile.base](file://kami-spider-monorepo/Dockerfile.base#L1-L87) \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/kami-spider-monorepo 模块/配置选项.md b/.qoder/repowiki/zh/content/kami-spider-monorepo 模块/配置选项.md new file mode 100644 index 0000000..1551d13 --- /dev/null +++ b/.qoder/repowiki/zh/content/kami-spider-monorepo 模块/配置选项.md @@ -0,0 +1,101 @@ +# 配置选项 + + +**Referenced Files in This Document** +- [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) + + +## 目录 +1. [引言](#引言) +2. [核心环境变量](#核心环境变量) +3. [Dockerfile静态配置](#dockerfile静态配置) +4. [配置最佳实践](#配置最佳实践) + +## 引言 +本文档深入解析kami-spider-monorepo模块的构建配置体系,重点阐述环境变量与Dockerfile中的关键配置项。通过分析`build-base-image.sh`构建脚本和`Dockerfile.base`基础镜像文件,揭示系统如何通过环境变量控制代理、版本和镜像仓库等核心行为,以及Dockerfile中关于系统依赖和运行环境的静态配置。 + +## 核心环境变量 + +本节分析控制构建流程的核心环境变量,包括`USE_PROXY`、`VERSION`和`DOCKER_REGISTRY`。 + +### USE_PROXY:代理加速控制 +`USE_PROXY`环境变量用于控制在安装Python依赖时是否启用国内镜像加速。该变量在`build-base-image.sh`脚本中被读取,并作为构建参数传递给Docker。 + +当`USE_PROXY`设置为`1`时,构建过程将使用清华大学的PyPI镜像源(https://pypi.tuna.tsinghua.edu.cn/simple/)来安装依赖,显著提升在特定网络环境下的下载速度。若该变量未设置或为其他值,则使用默认的官方PyPI源。 + +此机制通过在`Dockerfile.base`中使用条件判断实现,直接影响`uv sync`命令的`--index-url`参数,从而改变`uv`包管理器的行为。`pip`等其他兼容工具在该镜像环境中也会继承相同的网络策略。 + +**Section sources** +- [build-base-image.sh](file://kami-spider-monorepo/build-base-image.sh#L12) +- [Dockerfile.base](file://kami-spider-monorepo/Dockerfile.base#L59-L62) + +### VERSION:镜像版本管理 +`VERSION`环境变量用于指定Docker镜像的标签(tag)。在`build-base-image.sh`脚本中,该变量具有默认值`latest`,允许用户在构建时灵活指定语义化版本号(如`1.0.0`、`v2.1.3`等)。 + +该变量的值被用于`docker build`命令的`--tag`参数,为生成的镜像打上版本标签。同时,脚本也会创建一个`latest`标签的镜像,便于在开发和测试环境中快速引用最新版本。 + +这种设计支持语义化版本管理,使得镜像的发布、回滚和依赖追踪成为可能。 + +**Section sources** +- [build-base-image.sh](file://kami-spider-monorepo/build-base-image.sh#L11) +- [build-base-image.sh](file://kami-spider-monorepo/build-base-image.sh#L24-L25) + +### DOCKER_REGISTRY:镜像仓库配置 +`DOCKER_REGISTRY`环境变量决定了Docker镜像的推送目标地址。该变量在`build-base-image.sh`中被读取,其默认值为`localhost:5000`,指向本地的Docker Registry。 + +当`DOCKER_REGISTRY`被设置为非默认值时(例如公司的私有Registry地址),构建脚本会执行以下操作: +1. **标记镜像**:使用`docker tag`命令为本地镜像添加包含Registry地址的完整标签。 +2. **推送镜像**:使用`docker push`命令将标记好的镜像推送到指定的远程Registry。 + +此机制实现了镜像分发的灵活性,允许在不同环境(开发、测试、生产)中将镜像推送到不同的目标仓库。 + +**Section sources** +- [build-base-image.sh](file://kami-spider-monorepo/build-base-image.sh#L10) +- [build-base-image.sh](file://kami-spider-monorepo/build-base-image.sh#L30-L32) +- [build-base-image.sh](file://kami-spider-monorepo/build-base-image.sh#L38-L41) + +## Dockerfile静态配置 + +本节分析`Dockerfile.base`文件中定义的静态配置项,这些配置在构建时即被固化到镜像中。 + +### 时区与语言环境 +`Dockerfile.base`文件通过`ENV`指令设置了多个环境变量,但并未直接配置`Asia/Shanghai`时区或`zh_CN.UTF-8`语言环境。这表明时区和语言环境的配置可能由基础镜像`python:3.13-slim`继承,或在更高层的应用镜像中进行设置。 + +文件中定义的`PYTHONUNBUFFERED`和`PYTHONDONTWRITEBYTECODE`等环境变量,主要用于优化Python应用的运行时行为,确保日志实时输出和避免生成`.pyc`文件。 + +**Section sources** +- [Dockerfile.base](file://kami-spider-monorepo/Dockerfile.base#L4-L14) + +### 系统依赖 +`Dockerfile.base`通过`apt-get`命令安装了运行Playwright浏览器所必需的系统级依赖库。这些依赖包括: +- **核心工具**:`ca-certificates`, `curl` +- **图形与多媒体**:`fonts-liberation`, `libnss3`, `libasound2`, `libcups2t64` +- **显示与输入**:`libatk-bridge2.0-0`, `libxkbcommon0`, `libxcomposite1`, `libxrandr2` + +此外,文件还通过`playwright install-deps chromium`命令安装了Chromium浏览器的特定系统依赖。这些静态配置确保了Playwright在无头模式下能够稳定运行。 + +**Section sources** +- [Dockerfile.base](file://kami-spider-monorepo/Dockerfile.base#L17-L36) +- [Dockerfile.base](file://kami-spider-monorepo/Dockerfile.base#L70) + +## 配置最佳实践 + +### 在CI/CD流水线中安全传递Registry地址 +为了在CI/CD流水线中安全地传递`DOCKER_REGISTRY`地址,最佳实践是使用CI/CD平台的**秘密(Secrets)**功能。具体步骤如下: +1. 在CI/CD平台(如GitHub Actions, GitLab CI)的项目设置中,将Registry地址和认证凭据(如用户名、密码或Token)配置为加密的秘密变量。 +2. 在流水线配置文件(如`.github/workflows/build.yml`)中,引用这些秘密变量作为环境变量。 +3. 在调用`build-base-image.sh`脚本时,将这些环境变量传递给脚本。 + +例如,在GitHub Actions中: +```yaml +env: + DOCKER_REGISTRY: ${{ secrets.DOCKER_REGISTRY }} + DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} + DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} +``` +这种方式避免了将敏感信息硬编码在代码或配置文件中,保障了安全性。 + +**Section sources** +- [build-base-image.sh](file://kami-spider-monorepo/build-base-image.sh#L10) \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/快速开始.md b/.qoder/repowiki/zh/content/快速开始.md new file mode 100644 index 0000000..90e8694 --- /dev/null +++ b/.qoder/repowiki/zh/content/快速开始.md @@ -0,0 +1,217 @@ +# 快速开始 + + +**Referenced Files in This Document** +- [build-base-image.sh](file://alpine-base/build-base-image.sh) +- [build-base-image.sh](file://kami-gateway/build-base-image.sh) +- [build-base-image.sh](file://kami-spider-monorepo/build-base-image.sh) +- [README.md](file://alpine-base/README.md) +- [README.md](file://kami-gateway/README.md) +- [README.md](file://kami-spider-monorepo/README.md) + + +## 目录 +1. [简介](#简介) +2. [构建基础镜像](#构建基础镜像) +3. [环境变量配置](#环境变量配置) +4. [实际应用示例](#实际应用示例) +5. [常见问题与解决方案](#常见问题与解决方案) +6. [最佳实践](#最佳实践) + +## 简介 +本指南旨在帮助新手开发者在5分钟内完成基础镜像的本地构建。项目提供了三个模块(alpine-base、kami-gateway、kami-spider-monorepo)的预构建基础镜像,每个模块都包含一个 `build-base-image.sh` 构建脚本,用于创建优化的Docker基础镜像。这些镜像预装了常用工具、配置了中国镜像源、设置了正确的时区,并遵循安全最佳实践。 + +**Section sources** +- [README.md](file://alpine-base/README.md#L1-L70) +- [README.md](file://kami-gateway/README.md#L1-L60) +- [README.md](file://kami-spider-monorepo/README.md#L1-L34) + +## 构建基础镜像 + +### 基本构建步骤 +要构建基础镜像,请按照以下步骤操作: + +1. 打开终端并导航到目标模块目录 +2. 运行构建脚本 + +```bash +# 进入 alpine-base 模块 +cd alpine-base +# 执行构建 +./build-base-image.sh +``` + +```bash +# 进入 kami-gateway 模块 +cd kami-gateway +# 执行构建 +./build-base-image.sh +``` + +```bash +# 进入 kami-spider-monorepo 模块 +cd kami-spider-monorepo +# 执行构建 +./build-base-image.sh +``` + +构建成功后,您将看到类似以下的输出: +``` +🎉 Build completed successfully! +Available images: + - alpine-base:latest + - alpine-base:${VERSION} +``` + +**Section sources** +- [build-base-image.sh](file://alpine-base/build-base-image.sh#L1-L51) +- [build-base-image.sh](file://kami-gateway/build-base-image.sh#L1-L51) +- [build-base-image.sh](file://kami-spider-monorepo/build-base-image.sh#L1-L54) + +## 环境变量配置 + +构建脚本支持以下关键环境变量,您可以在运行脚本前设置它们: + +### DOCKER_REGISTRY +指定镜像推送的目标仓库地址。如果未设置,将使用默认值。 + +- **alpine-base 和 kami-gateway**: 默认为 `git.oceanpay.cc/danial` +- **kami-spider-monorepo**: 默认为 `localhost:5000` + +```bash +# 推送到私有镜像仓库 +DOCKER_REGISTRY=your-registry.com ./build-base-image.sh +``` + +### VERSION +指定镜像的版本标签。默认值为 `latest`。 + +```bash +# 构建指定版本的镜像 +VERSION=1.0.0 ./build-base-image.sh +``` + +### USE_PROXY +仅适用于 `kami-spider-monorepo` 模块,用于在构建时启用代理下载。 + +```bash +# 使用代理构建 +USE_PROXY=1 ./build-base-image.sh +``` + +**Section sources** +- [build-base-image.sh](file://alpine-base/build-base-image.sh#L9-L11) +- [build-base-image.sh](file://kami-gateway/build-base-image.sh#L9-L11) +- [build-base-image.sh](file://kami-spider-monorepo/build-base-image.sh#L9-L13) + +## 实际应用示例 + +### 构建场景示例 + +#### 不带参数构建 +```bash +# 在 alpine-base 目录下执行 +./build-base-image.sh +# 结果: 创建 alpine-base:latest 镜像 +``` + +#### 使用代理构建 +```bash +# 在 kami-spider-monorepo 目录下执行 +USE_PROXY=1 ./build-base-image.sh +# 结果: 启用代理下载依赖并创建 kami-spider-base:latest 镜像 +``` + +#### 推送到私有镜像仓库 +```bash +# 在 kami-gateway 目录下执行 +DOCKER_REGISTRY=my-registry.com/company ./build-base-image.sh +# 结果: 构建并推送 kami-gateway-base:latest 到指定仓库 +``` + +### 构建成功后的镜像标签 +- **alpine-base**: `alpine-base:latest`, `alpine-base:${VERSION}` +- **kami-gateway**: `kami-gateway-base:latest`, `kami-gateway-base:${VERSION}` +- **kami-spider-monorepo**: `kami-spider-base:latest`, `kami-spider-base:${VERSION}` + +### 在应用Dockerfile中使用基础镜像 +```dockerfile +# 使用基础镜像 +FROM alpine-base:latest + +# 复制应用代码并设置正确的所有者 +COPY --chown=appuser:appuser . /app/ + +# 切换到非root用户运行 +USER appuser + +# 运行应用 +CMD ["./your-app"] +``` + +**Section sources** +- [README.md](file://alpine-base/README.md#L39-L52) +- [README.md](file://kami-gateway/README.md#L23-L30) +- [README.md](file://kami-spider-monorepo/README.md#L14-L23) + +## 常见问题与解决方案 + +### 网络超时 +**问题**: 构建过程中出现网络下载超时错误。 + +**解决方案**: +1. 对于 `kami-spider-monorepo` 模块,使用代理构建: + ```bash + USE_PROXY=1 ./build-base-image.sh + ``` +2. 检查网络连接,确保可以访问所需的包管理器源。 + +### 权限错误 +**问题**: 运行构建脚本时出现权限不足错误。 + +**解决方案**: +1. 确保构建脚本具有可执行权限: + ```bash + chmod +x build-base-image.sh + ``` +2. 确保Docker服务正在运行且当前用户有权限访问Docker守护进程。 + +### 镜像推送失败 +**问题**: 当设置 `DOCKER_REGISTRY` 时,镜像推送失败。 + +**解决方案**: +1. 确认已登录到目标镜像仓库: + ```bash + docker login your-registry.com + ``` +2. 检查仓库地址和权限是否正确。 + +**Section sources** +- [build-base-image.sh](file://alpine-base/build-base-image.sh#L35-L39) +- [build-base-image.sh](file://kami-gateway/build-base-image.sh#L35-L39) +- [build-base-image.sh](file://kami-spider-monorepo/build-base-image.sh#L38-L42) + +## 最佳实践 + +### 非root用户运行 +所有基础镜像都配置了非root用户 `appuser` (UID: 1001),这是重要的安全最佳实践。在您的应用Dockerfile中,应始终使用 `USER` 指令切换到非root用户: + +```dockerfile +# 在复制应用代码后切换用户 +COPY --chown=appuser:appuser . /app/ +USER appuser +``` + +### 镜像优化 +- **轻量化**: 基于Alpine Linux,镜像体积小(约50MB) +- **快速构建**: 预装常用工具和配置,避免重复下载 +- **网络优化**: 配置中国镜像源,加速依赖下载 +- **证书支持**: 预装CA证书和自定义证书 + +### CI/CD集成 +`kami-gateway` 模块已配置Drone CI,能够自动检测目录变更并构建推送基础镜像,实现条件构建以节省资源。 + +**Section sources** +- [README.md](file://alpine-base/README.md#L62-L70) +- [README.md](file://kami-gateway/README.md#L53-L60) +- [README.md](file://kami-spider-monorepo/README.md#L25-L34) \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/通用构建指南.md b/.qoder/repowiki/zh/content/通用构建指南.md new file mode 100644 index 0000000..aa19ac3 --- /dev/null +++ b/.qoder/repowiki/zh/content/通用构建指南.md @@ -0,0 +1,170 @@ +# 通用构建指南 + + +**Referenced Files in This Document ** +- [build-base-image.sh](file://alpine-base/build-base-image.sh) +- [build-base-image.sh](file://kami-gateway/build-base-image.sh) +- [build-base-image.sh](file://kami-spider-monorepo/build-base-image.sh) + + +## 目录 +1. [引言](#引言) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概述](#架构概述) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) + +## 引言 +本文档旨在为 `kami` 项目中的通用构建流程提供权威指南。通过系统化分析 `alpine-base`、`kami-gateway` 和 `kami-spider-monorepo` 三个模块共用的构建机制,深入解析 `build-base-image.sh` 脚本的实现逻辑。文档将详细说明环境变量的统一处理方式、Docker 镜像标签的动态生成策略、构建命令的执行流程,并对比各模块构建脚本的异同,提炼出可复用的最佳实践模式,帮助开发者掌握整个项目的构建体系,提升自动化和可维护性。 + +## 项目结构 +`kami` 项目的构建体系由三个主要模块构成,每个模块均包含一个独立的 `build-base-image.sh` 构建脚本。这些脚本遵循相似的设计模式,用于构建各自模块所需的 Docker 基础镜像。项目结构清晰,按功能模块进行隔离,便于独立构建和维护。 + +```mermaid +graph TB +subgraph "构建模块" +A[alpine-base] +B[kami-gateway] +C[kami-spider-monorepo] +end +A --> |使用| Script[build-base-image.sh] +B --> |使用| Script +C --> |使用| Script +Script --> |执行| Docker[docker build/tag/push] +``` + +**Diagram sources** +- [alpine-base/build-base-image.sh](file://alpine-base/build-base-image.sh) +- [kami-gateway/build-base-image.sh](file://kami-gateway/build-base-image.sh) +- [kami-spider-monorepo/build-base-image.sh](file://kami-spider-monorepo/build-base-image.sh) + +**Section sources** +- [alpine-base/build-base-image.sh](file://alpine-base/build-base-image.sh) +- [kami-gateway/build-base-image.sh](file://kami-gateway/build-base-image.sh) +- [kami-spider-monorepo/build-base-image.sh](file://kami-spider-monorepo/build-base-image.sh) + +## 核心组件 +`build-base-image.sh` 脚本是整个构建体系的核心组件。它是一个 Bash 脚本,为每个模块提供标准化的 Docker 镜像构建、标记和推送流程。该脚本通过环境变量进行配置,实现了高度的灵活性和可复用性。其主要功能包括:解析环境变量、调用 `docker build` 命令构建镜像、根据配置生成并应用镜像标签、将镜像推送到指定的 Docker 仓库,并在构建完成后输出镜像信息。 + +**Section sources** +- [alpine-base/build-base-image.sh](file://alpine-base/build-base-image.sh) +- [kami-gateway/build-base-image.sh](file://kami-gateway/build-base-image.sh) +- [kami-spider-monorepo/build-base-image.sh](file://kami-spider-monorepo/build-base-image.sh) + +## 架构概述 +构建系统的架构遵循一个简洁而高效的模式。开发者通过设置环境变量来配置构建过程,然后执行 `build-base-image.sh` 脚本。脚本首先读取环境变量,然后执行 `docker build` 命令,利用 `Dockerfile.base` 文件构建本地镜像。接着,脚本会根据 `DOCKER_REGISTRY` 的配置,为镜像打上包含仓库地址的标签。如果指定了非本地的仓库,脚本会自动执行 `docker push` 命令将镜像推送到远程仓库。整个流程通过 `set -e` 保证了错误的及时中断,确保了构建的可靠性。 + +```mermaid +sequenceDiagram +participant Developer as 开发者 +participant Script as build-base-image.sh +participant Docker as Docker Engine +participant Registry as Docker Registry +Developer->>Script : 设置环境变量并执行脚本 +Script->>Script : 读取 DOCKER_REGISTRY, VERSION, USE_PROXY +Script->>Docker : docker build --tag : +Docker-->>Script : 构建成功 +alt 非本地仓库 +Script->>Script : docker tag 添加仓库前缀 +Script->>Registry : docker push 推送镜像 +Registry-->>Script : 推送成功 +end +Script->>Developer : 输出构建完成信息和镜像大小 +``` + +**Diagram sources** +- [alpine-base/build-base-image.sh](file://alpine-base/build-base-image.sh) +- [kami-gateway/build-base-image.sh](file://kami-gateway/build-base-image.sh) +- [kami-spider-monorepo/build-base-image.sh](file://kami-spider-monorepo/build-base-image.sh) + +## 详细组件分析 + +### 构建脚本实现逻辑分析 +`build-base-image.sh` 脚本的实现逻辑高度一致,体现了良好的代码复用原则。所有脚本都以 `#!/bin/bash` 开头,并通过 `set -e` 确保在任何命令失败时立即退出,防止错误的累积。脚本的核心是 `docker build` 命令,它使用 `--file Dockerfile.base` 指定构建文件,并通过 `--tag` 参数为镜像打上两个标签:一个由 `VERSION` 环境变量指定的版本号标签,另一个是 `latest` 标签。 + +**Section sources** +- [alpine-base/build-base-image.sh](file://alpine-base/build-base-image.sh#L1-L51) +- [kami-gateway/build-base-image.sh](file://kami-gateway/build-base-image.sh#L1-L51) +- [kami-spider-monorepo/build-base-image.sh](file://kami-spider-monorepo/build-base-image.sh#L1-L54) + +#### 环境变量处理 +脚本通过 Bash 的参数扩展语法 `${VAR:-default}` 来处理环境变量,这使得脚本既灵活又健壮。关键环境变量及其作用如下: + +- **`DOCKER_REGISTRY`**: 指定 Docker 镜像仓库的地址。默认值在不同模块中有所不同(`alpine-base` 和 `kami-gateway` 默认为 `git.oceanpay.cc/danial`,`kami-spider-monorepo` 默认为 `localhost:5000`)。当该值不为 `localhost:5000` 时,脚本会执行 `docker tag` 和 `docker push` 操作。 +- **`VERSION`**: 指定构建的镜像版本号。默认值为 `latest`。该变量用于生成镜像的版本标签。 +- **`USE_PROXY`**: 一个布尔标志(0 或 1),仅在 `kami-spider-monorepo` 模块中使用。当设置为 `1` 时,它会作为 `--build-arg` 传递给 `docker build` 命令,用于在构建过程中启用中国代理加速,从而加快依赖下载速度。 + +```mermaid +flowchart TD +Start([开始构建]) --> SetVars["设置环境变量\nDOCKER_REGISTRY, VERSION, USE_PROXY"] +SetVars --> ReadVars["读取变量值\n使用默认值回退"] +ReadVars --> BuildImage["执行 docker build\n生成本地镜像"] +BuildImage --> CheckRegistry{"REGISTRY != localhost:5000?"} +CheckRegistry --> |是| TagImage["执行 docker tag\n添加仓库前缀"] +TagImage --> PushImage["执行 docker push\n推送至远程仓库"] +PushImage --> ShowInfo["显示构建完成信息\n和镜像大小"] +CheckRegistry --> |否| ShowInfo +ShowInfo --> End([构建完成]) +``` + +**Diagram sources** +- [alpine-base/build-base-image.sh](file://alpine-base/build-base-image.sh#L10-L11) +- [kami-gateway/build-base-image.sh](file://kami-gateway/build-base-image.sh#L10-L11) +- [kami-spider-monorepo/build-base-image.sh](file://kami-spider-monorepo/build-base-image.sh#L10-L12) + +#### 模块间构建脚本对比 +通过对三个模块的 `build-base-image.sh` 脚本进行对比,可以发现它们在核心逻辑上高度一致,但在细节上有所差异,以适应各自模块的需求。 + +| 特性 | alpine-base | kami-gateway | kami-spider-monorepo | +| :--- | :--- | :--- | :--- | +| **基础镜像名称** | `alpine-base` | `kami-gateway-base` | `kami-spider-base` | +| **默认 DOCKER_REGISTRY** | `git.oceanpay.cc/danial` | `git.oceanpay.cc/danial` | `localhost:5000` | +| **USE_PROXY 支持** | 否 | 否 | 是 | +| **构建参数 (build-arg)** | 无 | 无 | `USE_PROXY` | +| **用途** | 提供优化的 Alpine 基础环境 | 提供 Go 环境和 Alpine 运行时 | 提供包含 Python 依赖和 Playwright 的综合基础环境 | + +此对比表明,`kami-spider-monorepo` 模块的构建脚本更为复杂,因为它需要处理网络代理问题,而其他两个模块的脚本则更侧重于基础环境的构建。 + +**Section sources** +- [alpine-base/build-base-image.sh](file://alpine-base/build-base-image.sh) +- [kami-gateway/build-base-image.sh](file://kami-gateway/build-base-image.sh) +- [kami-spider-monorepo/build-base-image.sh](file://kami-spider-monorepo/build-base-image.sh) + +## 依赖分析 +该构建系统的主要依赖是 Docker 引擎本身。脚本通过调用 `docker` CLI 命令与 Docker 守护进程进行交互。此外,构建过程依赖于每个模块根目录下的 `Dockerfile.base` 文件,该文件定义了镜像的具体构建步骤。`kami-spider-monorepo` 模块还依赖于 `pyproject.toml` 和 `uv.lock` 文件来管理其 Python 依赖。 + +```mermaid +graph LR +Script[build-base-image.sh] --> Docker[docker CLI] +Script --> Dockerfile[Dockerfile.base] +Script --> Env[环境变量] +Dockerfile --> BaseImage[基础操作系统镜像] +Docker --> Registry[Docker Registry] +``` + +**Diagram sources** +- [alpine-base/build-base-image.sh](file://alpine-base/build-base-image.sh) +- [kami-gateway/build-base-image.sh](file://kami-gateway/build-base-image.sh) +- [kami-spider-monorepo/build-base-image.sh](file://kami-spider-monorepo/build-base-image.sh) + +## 性能考虑 +构建过程的性能主要受网络带宽和 Docker 构建缓存的影响。`USE_PROXY=1` 环境变量的引入是针对中国地区网络环境的性能优化,通过代理加速依赖下载,显著缩短了构建时间。此外,Docker 的构建缓存机制可以极大地提升重复构建的效率。只要 `Dockerfile` 中的指令和上下文没有改变,Docker 就会重用之前的构建层,避免了不必要的重复工作。为了最大化利用缓存,建议在 `Dockerfile` 中将不常变动的指令(如安装系统包)放在前面,而将经常变动的指令(如复制应用代码)放在后面。 + +## 故障排除指南 +当构建过程出现问题时,可以采取以下调试技巧: +1. **检查环境变量**:确保 `DOCKER_REGISTRY`、`VERSION` 等环境变量已正确设置。 +2. **查看脚本输出**:脚本本身提供了详细的日志信息,包括正在执行的步骤和最终的镜像大小,这些信息有助于定位问题。 +3. **手动执行命令**:可以复制脚本中的 `docker build`、`docker tag` 或 `docker push` 命令,在终端中手动执行,以获取更详细的错误信息。 +4. **启用详细模式**:虽然当前脚本未使用 `set -x`,但可以在脚本开头添加此命令,以启用 Bash 的调试模式,逐行输出执行的命令,这对于追踪复杂的逻辑分支非常有用。 + +**Section sources** +- [alpine-base/build-base-image.sh](file://alpine-base/build-base-image.sh) +- [kami-gateway/build-base-image.sh](file://kami-gateway/build-base-image.sh) +- [kami-spider-monorepo/build-base-image.sh](file://kami-spider-monorepo/build-base-image.sh) + +## 结论 +`kami` 项目的构建体系通过标准化的 `build-base-image.sh` 脚本,实现了跨模块的构建自动化。该体系设计简洁、逻辑清晰,通过环境变量实现了良好的配置灵活性。`USE_PROXY` 变量的引入体现了对特定部署环境的考量。通过遵循本文档中总结的最佳实践,如合理利用构建缓存、正确设置环境变量和使用调试技巧,开发者可以高效、可靠地完成镜像构建任务,为项目的持续集成和部署(CI/CD)奠定坚实的基础。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/项目概述/alpine-base 模块.md b/.qoder/repowiki/zh/content/项目概述/alpine-base 模块.md new file mode 100644 index 0000000..72d01c0 --- /dev/null +++ b/.qoder/repowiki/zh/content/项目概述/alpine-base 模块.md @@ -0,0 +1,206 @@ +# alpine-base 模块 + + +**Referenced Files in This Document** +- [README.md](file://alpine-base/README.md) +- [build-base-image.sh](file://alpine-base/build-base-image.sh) +- [Dockerfile.base](file://alpine-base/Dockerfile.base) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心特性](#核心特性) +4. [架构设计](#架构设计) +5. [构建流程](#构建流程) +6. [使用方法](#使用方法) +7. [性能与安全](#性能与安全) +8. [结论](#结论) + +## 简介 +`alpine-base` 模块是一个优化的 Alpine Linux 基础镜像,专为各种容器化应用设计。该镜像基于 `alpine:latest`,通过配置中国镜像源、设置时区、创建非 root 用户和集成自定义证书等优化措施,提供了一个轻量、安全、网络优化的 Linux 运行时环境。预装的常用工具集(如 curl、wget、git、bash 等)显著提升了开发效率。该模块在微服务架构中扮演着基础支撑角色,为上层镜像提供一致且可靠的运行环境。 + +**Section sources** +- [README.md](file://alpine-base/README.md#L1-L70) + +## 项目结构 +`alpine-base` 模块包含以下核心文件: +- `Dockerfile.base`:定义基础镜像的 Dockerfile +- `build-base-image.sh`:用于构建和推送镜像的脚本 +- `README.md`:模块的说明文档 + +这些文件共同构成了一个完整的镜像构建和管理解决方案,确保了镜像的一致性和可重复性。 + +```mermaid +graph TD +A[Dockerfile.base] --> B[基础镜像定义] +C[build-base-image.sh] --> D[构建与推送] +E[README.md] --> F[使用说明] +B --> G[alpine-base:latest] +D --> G +F --> G +``` + +**Diagram sources** +- [Dockerfile.base](file://alpine-base/Dockerfile.base#L1-L58) +- [build-base-image.sh](file://alpine-base/build-base-image.sh#L1-L51) +- [README.md](file://alpine-base/README.md#L1-L70) + +**Section sources** +- [README.md](file://alpine-base/README.md#L5-L8) + +## 核心特性 +`alpine-base` 镜像具备以下核心特性: + +### 基础环境 +- **基础镜像**:基于最新的 `alpine:latest`,确保系统安全性和稳定性 +- **镜像源**:配置阿里云中国镜像源,显著加速软件包下载速度 +- **时区**:设置为 `Asia/Shanghai`,符合中国用户的时区需求 + +### 预装工具 +- **网络工具**:预装 `curl`、`wget`、`git`,方便网络操作和代码管理 +- **系统工具**:包含 `bash`、`tar`、`gzip`,提供基本的系统操作能力 +- **证书管理**:集成 `ca-certificates` 和自定义证书,确保安全通信 +- **包管理**:预装 `apk-tools`,便于后续软件包管理 + +### 用户配置 +- **非 root 用户**:创建 `appuser` 用户(UID 1001),以非 root 权限运行应用,提升安全性 +- **应用目录**:创建 `/app` 目录并设置正确的文件权限 +- **安全权限**:所有文件和目录均设置为安全的权限配置 + +**Section sources** +- [README.md](file://alpine-base/README.md#L12-L27) + +## 架构设计 +`alpine-base` 的架构设计体现了分层继承和优化配置的理念。 + +### 分层继承机制 +镜像基于 `alpine:latest` 进行构建,通过 Docker 的分层机制,每一层都添加特定的配置和工具。这种设计使得镜像构建过程清晰且可维护。 + +### 中国镜像源配置 +通过修改 `/etc/apk/repositories` 文件,将 Alpine 的软件源替换为阿里云镜像源。这不仅加快了软件包的下载速度,还提高了构建的稳定性。 + +### 时区设置 +通过设置 `TZ` 环境变量和复制时区文件,将系统时区设置为 `Asia/Shanghai`。这确保了容器内的时间与本地时间一致。 + +### 非 root 用户创建 +使用 `addgroup` 和 `adduser` 命令创建 `appuser` 用户,并将其主目录设置为 `/app`。通过 `USER` 指令切换到该用户,确保应用以非 root 权限运行。 + +### 自定义证书集成 +通过 `curl` 下载自定义证书并使用 `update-ca-certificates` 命令更新证书库,确保容器能够信任特定的证书颁发机构。 + +```mermaid +classDiagram +class AlpineBase { ++string base_image : alpine : latest ++string timezone : Asia/Shanghai ++string registry : git.oceanpay.cc/danial ++string user : appuser (UID : 1001) ++string workdir : /app ++list tools : [curl, wget, git, bash, ...] ++list certificates : [ca-certificates, custom.crt] ++build() : void ++push() : void +} +AlpineBase : --|> alpine : latest : inherits +AlpineBase : uses "阿里云镜像源" : configures +AlpineBase : creates "appuser" : user management +AlpineBase : installs "预装工具" : package management +AlpineBase : integrates "自定义证书" : security +``` + +**Diagram sources** +- [Dockerfile.base](file://alpine-base/Dockerfile.base#L4-L58) + +**Section sources** +- [Dockerfile.base](file://alpine-base/Dockerfile.base#L4-L58) +- [README.md](file://alpine-base/README.md#L13-L15) + +## 构建流程 +`alpine-base` 的构建流程由 `build-base-image.sh` 脚本自动化完成。 + +### 构建脚本逻辑 +1. **配置参数**:设置镜像名称、注册表和版本号 +2. **构建镜像**:使用 `docker build` 命令基于 `Dockerfile.base` 构建镜像 +3. **标记镜像**:为本地和远程注册表创建相应的标签 +4. **推送镜像**:如果指定了远程注册表,则推送镜像 +5. **显示信息**:输出构建完成的信息和镜像大小 + +### 环境变量 +- `DOCKER_REGISTRY`:指定镜像推送的目标注册表,默认为 `git.oceanpay.cc/danial` +- `VERSION`:指定镜像版本,默认为 `latest` + +```mermaid +flowchart TD +A[开始构建] --> B[读取环境变量] +B --> C{是否指定注册表?} +C --> |是| D[设置REGISTRY] +C --> |否| E[使用默认值] +D --> F[构建镜像] +E --> F +F --> G[标记本地镜像] +G --> H{是否远程注册表?} +H --> |是| I[标记远程镜像] +H --> |否| J[跳过] +I --> K[推送镜像] +J --> L[完成] +K --> L +L --> M[显示镜像信息] +``` + +**Diagram sources** +- [build-base-image.sh](file://alpine-base/build-base-image.sh#L1-L51) + +**Section sources** +- [build-base-image.sh](file://alpine-base/build-base-image.sh#L1-L51) +- [README.md](file://alpine-base/README.md#L30-L37) + +## 使用方法 +### 本地构建与推送 +```bash +# 构建基础镜像 +./build-base-image.sh + +# 推送到镜像仓库 +DOCKER_REGISTRY=git.oceanpay.cc/danial ./build-base-image.sh +``` + +### 在应用 Dockerfile 中使用 +```dockerfile +# 使用基础镜像 +FROM git.oceanpay.cc/danial/alpine-base:latest + +# 复制应用代码 +COPY --chown=appuser:appuser . /app/ + +# 切换到非 root 用户 +USER appuser + +# 运行应用 +CMD ["./your-app"] +``` + +**Section sources** +- [README.md](file://alpine-base/README.md#L39-L52) + +## 性能与安全 +### 性能优化 +- **镜像缓存**:利用 Docker 的层缓存机制,避免重复下载和安装 +- **精简安装**:使用 `--no-cache` 选项,减少镜像体积 +- **并行构建**:在 CI/CD 中并行构建多个镜像 + +### 安全加固 +- **非 root 运行**:应用以 `appuser` 用户身份运行,降低安全风险 +- **最小权限**:只安装必要的工具和包 +- **定期更新**:定期更新基础镜像和软件包 + +### CI/CD 集成 +- **自动化构建**:在 CI/CD 流水线中自动构建和推送镜像 +- **版本管理**:使用语义化版本号管理镜像版本 +- **镜像扫描**:集成安全扫描工具,检测漏洞 + +**Section sources** +- [README.md](file://alpine-base/README.md#L62-L69) + +## 结论 +`alpine-base` 模块通过精心设计的架构和优化配置,为上层镜像提供了一个轻量、安全、高效的 Linux 运行时环境。其预装的工具集和中国镜像源配置显著提升了开发效率和构建速度。通过非 root 用户运行和自定义证书集成,确保了应用的安全性。该模块在微服务架构中扮演着基础支撑角色,为构建稳定可靠的容器化应用提供了坚实的基础。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/项目概述/kami-gateway 模块/CI_CD集成与自动化.md b/.qoder/repowiki/zh/content/项目概述/kami-gateway 模块/CI_CD集成与自动化.md new file mode 100644 index 0000000..57b2994 --- /dev/null +++ b/.qoder/repowiki/zh/content/项目概述/kami-gateway 模块/CI_CD集成与自动化.md @@ -0,0 +1,150 @@ +# CI/CD集成与自动化 + + +**Referenced Files in This Document** +- [build-base-image.sh](file://kami-gateway/build-base-image.sh) +- [README.md](file://kami-gateway/README.md) +- [build-base-image.sh](file://kami-spider-monorepo/build-base-image.sh) +- [build-base-image.sh](file://alpine-base/build-base-image.sh) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概述](#架构概述) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) + +## 简介 +本文档全面介绍kami-gateway模块与Drone CI等持续集成系统的集成方案。文档解析了构建脚本中的环境变量控制逻辑,说明了如何实现条件化构建与镜像推送,阐述了变更检测机制如何避免不必要的镜像重建,展示了在CI流水线中如何安全地注入凭证并执行构建任务,并讨论了镜像标签策略的最佳实践。 + +## 项目结构 +项目包含多个模块的构建脚本,每个模块都有独立的构建配置。kami-gateway模块作为重点分析对象,其构建流程代表了整个项目的CI/CD实践标准。 + +**Section sources** +- [build-base-image.sh](file://kami-gateway/build-base-image.sh#L1-L51) +- [README.md](file://kami-gateway/README.md#L1-L60) + +## 核心组件 +kami-gateway模块的核心构建组件是`build-base-image.sh`脚本,该脚本负责创建包含Go环境和Alpine运行时的基础Docker镜像。脚本实现了环境变量控制、条件构建、镜像标记和推送等关键功能。 + +**Section sources** +- [build-base-image.sh](file://kami-gateway/build-base-image.sh#L1-L51) + +## 架构概述 +kami-gateway的CI/CD架构基于Drone CI系统,通过变更检测机制触发条件化构建流程。构建脚本与CI系统协同工作,实现了高效的镜像构建和推送流程。 + +```mermaid +graph TB +subgraph "CI/CD Pipeline" +Trigger["变更检测\n(Drone CI)"] --> Condition["条件判断\n(目录变更)"] +Condition --> Build["执行构建\n(build-base-image.sh)"] +Build --> Push["镜像推送\n(Registry)"] +end +subgraph "构建脚本" +Env["环境变量控制\n(VERSION, DOCKER_REGISTRY)"] --> Build +Proxy["代理配置\n(USE_PROXY)"] --> Build +Tagging["镜像标记策略\n(latest, version)"] --> Build +end +Trigger --> Build +Build --> Push +``` + +**Diagram sources ** +- [build-base-image.sh](file://kami-gateway/build-base-image.sh#L1-L51) +- [README.md](file://kami-gateway/README.md#L53-L60) + +## 详细组件分析 + +### 构建脚本分析 +kami-gateway的构建脚本实现了完整的CI/CD流程,包括环境变量配置、镜像构建、标记和推送等步骤。 + +#### 环境变量控制逻辑 +```mermaid +flowchart TD +Start([开始]) --> Registry["REGISTRY=\n${DOCKER_REGISTRY:-git.oceanpay.cc/danial}"] +Registry --> Version["VERSION=\n${VERSION:-latest}"] +Version --> UseProxy["USE_PROXY=\n${USE_PROXY:-0}"] +UseProxy --> Build["执行docker build"] +Build --> ConditionalTag["条件标记\n(REGISTRY != localhost:5000)"] +ConditionalTag --> Push["条件推送\n(REGISTRY != localhost:5000)"] +Push --> End([完成]) +``` + +**Diagram sources ** +- [build-base-image.sh](file://kami-gateway/build-base-image.sh#L9-L11) +- [build-base-image.sh](file://kami-spider-monorepo/build-base-image.sh#L9-L12) + +**Section sources** +- [build-base-image.sh](file://kami-gateway/build-base-image.sh#L1-L51) + +#### CI/CD工作流程 +```mermaid +sequenceDiagram +participant Drone as "Drone CI" +participant Script as "build-base-image.sh" +participant Docker as "Docker Engine" +participant Registry as "镜像仓库" +Drone->>Script : 检测到kami-gateway/目录变更 +Script->>Script : 初始化环境变量 +Script->>Docker : 执行docker build +Docker-->>Script : 返回构建结果 +Script->>Script : 检查REGISTRY配置 +alt 非本地仓库 +Script->>Docker : 执行docker tag +Script->>Registry : 执行docker push +Registry-->>Script : 返回推送结果 +end +Script->>Drone : 返回构建状态 +``` + +**Diagram sources ** +- [README.md](file://kami-gateway/README.md#L53-L60) +- [build-base-image.sh](file://kami-gateway/build-base-image.sh#L27-L39) + +### 镜像标签策略 +kami-gateway采用多标签策略,为每个构建版本创建两个标签:版本号标签和latest标签,确保既有版本追溯性又有最新版本可用性。 + +**Section sources** +- [build-base-image.sh](file://kami-gateway/build-base-image.sh#L21-L23) + +## 依赖分析 +各模块的构建脚本具有相似的结构和逻辑,表明项目采用了统一的构建标准。kami-gateway模块作为Go应用的代表,其构建流程为其他模块提供了参考模式。 + +```mermaid +graph TB +alpine-base --> kami-gateway +kami-gateway --> kami-spider-monorepo +common["通用构建模式"] --> alpine-base +common --> kami-gateway +common --> kami-spider-monorepo +``` + +**Diagram sources ** +- [build-base-image.sh](file://alpine-base/build-base-image.sh#L1-L51) +- [build-base-image.sh](file://kami-gateway/build-base-image.sh#L1-L51) +- [build-base-image.sh](file://kami-spider-monorepo/build-base-image.sh#L1-L54) + +**Section sources** +- [build-base-image.sh](file://alpine-base/build-base-image.sh#L1-L51) +- [build-base-image.sh](file://kami-gateway/build-base-image.sh#L1-L51) +- [build-base-image.sh](file://kami-spider-monorepo/build-base-image.sh#L1-L54) + +## 性能考虑 +通过条件化构建和变更检测机制,系统避免了不必要的镜像重建,显著提升了资源利用率。基础镜像缓存机制将应用构建时间缩短至10-30秒,Go模块预下载避免了重复下载,多阶段构建优化了最终镜像体积。 + +**Section sources** +- [README.md](file://kami-gateway/README.md#L47-L52) + +## 故障排除指南 +当CI/CD流程出现问题时,应首先检查环境变量配置是否正确,特别是DOCKER_REGISTRY和VERSION变量。确认变更检测机制是否正常工作,检查构建脚本的条件判断逻辑是否按预期执行。 + +**Section sources** +- [build-base-image.sh](file://kami-gateway/build-base-image.sh#L27-L39) + +## 结论 +kami-gateway模块的CI/CD集成方案展示了高效的自动化构建实践。通过环境变量控制、条件化构建、变更检测和多标签策略,系统实现了资源高效利用和版本可追溯性的平衡。该方案可作为其他模块的参考模板,并可根据需要扩展支持多平台构建和自动化安全扫描等高级功能。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/项目概述/kami-gateway 模块/Go依赖管理.md b/.qoder/repowiki/zh/content/项目概述/kami-gateway 模块/Go依赖管理.md new file mode 100644 index 0000000..2e2ad9d --- /dev/null +++ b/.qoder/repowiki/zh/content/项目概述/kami-gateway 模块/Go依赖管理.md @@ -0,0 +1,169 @@ +# Go依赖管理 + + +**Referenced Files in This Document** +- [go.mod](file://kami-gateway/go.mod) +- [go.sum](file://kami-gateway/go.sum) +- [Dockerfile.base](file://kami-gateway/Dockerfile.base) +- [build-base-image.sh](file://kami-gateway/build-base-image.sh) +- [README.md](file://kami-gateway/README.md) + + +## 目录 +1. [引言](#引言) +2. [项目结构](#项目结构) +3. [核心依赖分析](#核心依赖分析) +4. [依赖版本锁定机制](#依赖版本锁定机制) +5. [Docker构建优化策略](#docker构建优化策略) +6. [预下载依赖的优势](#预下载依赖的优势) +7. [常见问题解决方案](#常见问题解决方案) +8. [依赖升级与兼容性验证](#依赖升级与兼容性验证) +9. [结论](#结论) + +## 引言 +本文档深入解析kami-gateway模块的Go依赖管理体系,重点阐述基于go.mod和go.sum文件的依赖版本锁定机制与可重现构建的重要性。通过分析Docker构建过程中预下载依赖(go mod download)的实践,说明其如何消除构建时的网络不确定性并大幅提升CI/CD效率。同时对比直接在运行时下载依赖的模式,分析预下载方案在稳定性、安全性和性能方面的优势,并提供常见问题的解决方案。 + +## 项目结构 +kami-gateway模块采用标准的Go项目结构,包含go.mod和go.sum文件用于依赖管理,以及Docker相关文件用于容器化构建。项目通过Docker多阶段构建实现高效的CI/CD流程。 + +```mermaid +graph TD +A[项目根目录] --> B[go.mod] +A --> C[go.sum] +A --> D[Dockerfile.base] +A --> E[build-base-image.sh] +A --> F[README.md] +``` + +**Diagram sources** +- [go.mod](file://kami-gateway/go.mod) +- [go.sum](file://kami-gateway/go.sum) +- [Dockerfile.base](file://kami-gateway/Dockerfile.base) + +**Section sources** +- [README.md](file://kami-gateway/README.md) + +## 核心依赖分析 +kami-gateway模块依赖多个关键的第三方库,这些库在API网关场景下发挥着重要作用: + +- **beego/beego/v2**: Web框架,提供路由、MVC架构等基础功能 +- **bytedance/sonic**: 高性能JSON序列化库,提升API数据处理效率 +- **go.opentelemetry.io/otel**: 分布式追踪和监控框架,实现服务可观测性 +- **redis/go-redis/v9**: Redis客户端,用于缓存和会话管理 +- **go-resty/resty/v2**: HTTP客户端,简化外部API调用 + +这些依赖通过go.mod文件明确声明,确保了依赖关系的清晰和可管理性。 + +**Section sources** +- [go.mod](file://kami-gateway/go.mod#L7-L39) + +## 依赖版本锁定机制 +Go模块系统通过go.mod和go.sum文件实现依赖版本的精确锁定和完整性验证。 + +go.mod文件定义了项目直接依赖的模块及其版本,例如: +- github.com/beego/beego/v2 v2.3.8 +- github.com/bytedance/sonic v1.14.2 +- go.opentelemetry.io/otel v1.38.0 + +go.sum文件则记录了每个依赖模块的校验和,确保下载的依赖包未被篡改。这种双重锁定机制保证了构建的可重现性,无论在何种环境下构建,都能获得完全相同的依赖版本和内容。 + +可重现构建对于生产环境至关重要,它消除了"在我机器上能运行"的问题,确保开发、测试和生产环境的一致性。 + +**Section sources** +- [go.mod](file://kami-gateway/go.mod) +- [go.sum](file://kami-gateway/go.sum) + +## Docker构建优化策略 +kami-gateway采用创新的Docker构建策略,通过预下载依赖大幅提升构建效率。 + +在Dockerfile.base中,关键步骤包括: +1. 复制go.mod和go.sum文件 +2. 执行`go mod download`预下载所有依赖 +3. 构建应用时直接使用已缓存的依赖 + +这种策略将依赖下载与应用构建分离,实现了构建缓存的最大化利用。当应用代码变更时,Docker只需重新构建应用层,而无需重新下载可能耗时的依赖包。 + +```mermaid +sequenceDiagram +participant Dev as 开发者 +participant Docker as Docker构建 +participant Proxy as GOPROXY +Dev->>Docker : 提交代码变更 +Docker->>Docker : 检查Dockerfile变更 +alt 依赖未变更 +Docker->>Docker : 使用缓存的依赖层 +Docker->>Docker : 快速构建应用 +Docker-->>Dev : 10-30秒完成构建 +else 依赖变更 +Docker->>Proxy : 下载新依赖 +Proxy-->>Docker : 返回依赖包 +Docker->>Docker : 构建新依赖层 +Docker->>Docker : 构建应用 +Docker-->>Dev : 完成构建 +end +``` + +**Diagram sources** +- [Dockerfile.base](file://kami-gateway/Dockerfile.base#L50-L55) +- [build-base-image.sh](file://kami-gateway/build-base-image.sh) + +## 预下载依赖的优势 +预下载依赖方案相比直接在运行时下载依赖具有显著优势: + +### 稳定性优势 +- 消除网络波动对构建过程的影响 +- 避免因依赖仓库临时不可用导致的构建失败 +- 通过go mod verify确保依赖完整性 + +### 安全性优势 +- 所有依赖经过预先验证和审核 +- 减少构建时对外部网络的依赖,降低攻击面 +- 可以在隔离环境中完成依赖下载和验证 + +### 性能优势 +- 应用构建时间从分钟级缩短至10-30秒 +- CI/CD流水线执行效率大幅提升 +- 资源利用率更高,减少构建节点的负载 + +这种优化使得开发者能够更快地获得反馈,加速迭代周期。 + +**Section sources** +- [Dockerfile.base](file://kami-gateway/Dockerfile.base#L54) +- [README.md](file://kami-gateway/README.md#L49-L51) + +## 常见问题解决方案 +### 依赖冲突处理 +当出现依赖版本冲突时,可以使用go mod tidy命令自动解决,或手动在go.mod中使用replace指令指定特定版本。 + +### 私有模块拉取配置 +通过设置GOPRIVATE环境变量,可以配置哪些模块为私有模块,避免通过公共代理下载: +```bash +ENV GOPRIVATE=git.oceanpay.cc/* +``` + +### 校验和不匹配错误 +当go.sum中记录的校验和与实际下载的包不匹配时,可能是依赖包被篡改或缓存损坏。解决方案包括: +1. 执行`go clean -modcache`清除模块缓存 +2. 重新执行`go mod download` +3. 检查网络代理是否返回了正确的包 + +**Section sources** +- [Dockerfile.base](file://kami-gateway/Dockerfile.base#L9) +- [go.sum](file://kami-gateway/go.sum) + +## 依赖升级与兼容性验证 +安全地升级依赖版本需要遵循以下步骤: + +1. 使用`go get -u`命令升级特定依赖 +2. 运行`go mod tidy`清理未使用的依赖 +3. 执行完整的测试套件验证功能兼容性 +4. 检查性能基准是否有显著变化 +5. 在预发布环境进行充分验证 + +对于关键依赖如OpenTelemetry、beego等,建议密切关注其发布说明,了解可能的破坏性变更。 + +**Section sources** +- [go.mod](file://kami-gateway/go.mod) + +## 结论 +kami-gateway模块通过科学的Go依赖管理实践,实现了高效、稳定和安全的构建流程。基于go.mod和go.sum的版本锁定机制确保了可重现构建,而Docker预下载依赖策略则大幅提升了CI/CD效率。这种架构设计不仅优化了开发体验,也为生产环境的稳定性提供了坚实保障。建议持续遵循最佳实践,定期审查和更新依赖,保持系统的安全性和性能。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/项目概述/kami-gateway 模块/kami-gateway 模块.md b/.qoder/repowiki/zh/content/项目概述/kami-gateway 模块/kami-gateway 模块.md new file mode 100644 index 0000000..f09f009 --- /dev/null +++ b/.qoder/repowiki/zh/content/项目概述/kami-gateway 模块/kami-gateway 模块.md @@ -0,0 +1,203 @@ +# kami-gateway 模块 + + +**本文档引用文件** +- [Dockerfile.base](file://kami-gateway/Dockerfile.base) +- [build-base-image.sh](file://kami-gateway/build-base-image.sh) +- [go.mod](file://kami-gateway/go.mod) +- [go.sum](file://kami-gateway/go.sum) +- [README.md](file://kami-gateway/README.md) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概述](#架构概述) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考量](#性能考量) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) + +## 简介 +kami-gateway 模块提供了一个专为 Go 语言网关服务设计的基础 Docker 镜像,旨在优化构建效率、提升安全性并简化部署流程。该模块通过预配置的编译环境和依赖缓存机制,显著缩短了应用构建时间(10-30秒),适用于 API 网关类微服务的快速迭代与发布。 + +## 项目结构 +kami-gateway 模块包含构建基础镜像所需的核心文件,组织清晰,职责明确: + +``` +kami-gateway/ +├── README.md # 模块说明文档 +├── build-base-image.sh # 基础镜像构建脚本 +├── go.mod # Go 依赖管理文件 +├── go.sum # 依赖校验文件 +├── Dockerfile.base # 基础镜像定义 +└── Dockerfile.improved # 改进版应用镜像定义(引用) +``` + +**Section sources** +- [README.md](file://kami-gateway/README.md#L1-L60) + +## 核心组件 +本模块的核心在于 `Dockerfile.base` 和 `build-base-image.sh` 脚本的协同工作,前者定义了包含 Go 1.25 编译环境和 Alpine 运行时的基础镜像,后者则封装了镜像构建、标记与推送的完整流程。 + +**Section sources** +- [Dockerfile.base](file://kami-gateway/Dockerfile.base#L1-L59) +- [build-base-image.sh](file://kami-gateway/build-base-image.sh#L1-L51) + +## 架构概述 +kami-gateway 的架构围绕“基础镜像预构建 + 应用镜像快速构建”的理念展开。基础镜像预先集成了 Go 编译环境、中国镜像源、时区、证书及依赖包,使得后续的应用镜像构建只需专注于业务代码编译,从而实现极速构建。 + +```mermaid +graph TB +subgraph "基础镜像构建" +A[Dockerfile.base] --> B[Go 1.25 Alpine] +B --> C[配置环境变量] +C --> D[安装系统依赖] +D --> E[下载自定义证书] +E --> F[创建非root用户] +F --> G[预下载Go依赖] +G --> H[kami-gateway-base:latest] +end +subgraph "应用镜像构建" +I[Dockerfile.improved] --> J[多阶段构建] +J --> K[使用kami-gateway-base作为基础] +K --> L[编译Go应用] +L --> M[生成轻量运行镜像] +end +H --> K +``` + +**Diagram sources** +- [Dockerfile.base](file://kami-gateway/Dockerfile.base#L1-L59) +- [README.md](file://kami-gateway/README.md#L7-L8) + +## 详细组件分析 + +### Dockerfile.base 实现细节 +`Dockerfile.base` 是构建 kami-gateway 基础镜像的核心。它从 `golang:1.25-alpine` 镜像开始,通过一系列优化步骤构建出一个高效、安全的编译环境。 + +#### 环境与依赖配置 +该文件设置了关键的 Go 环境变量,包括 `GO111MODULE=on` 启用模块化管理,`GOPROXY=https://goproxy.cn,direct` 配置国内代理以加速依赖下载,以及 `CGO_ENABLED=0` 确保生成静态链接的二进制文件。 + +#### 系统优化 +使用阿里云的 Alpine 镜像源替换默认源,显著提升 `apk` 包管理器的下载速度。同时,预装了 `tzdata` 并设置时区为 `Asia/Shanghai`,避免了应用运行时的时区问题。 + +#### 安全与证书 +创建了 UID 为 1001 的非 root 用户 `appuser`,并在后续步骤中切换至此用户,遵循最小权限原则。此外,通过 `curl` 下载并安装了 Comodo AAA 证书,解决了某些网络环境下可能出现的证书信任问题。 + +#### 依赖预下载 +通过 `COPY go.mod go.sum* ./` 和 `RUN go mod download && go mod verify` 命令,将依赖下载和验证步骤前置到基础镜像中。这使得所有基于此镜像构建的应用都能跳过耗时的依赖拉取过程,直接进入代码编译阶段。 + +```mermaid +flowchart TD +Start([开始构建]) --> BaseImage["FROM golang:1.25-alpine"] +BaseImage --> Env["设置环境变量
GOPROXY, CGO_ENABLED等"] +Env --> Repos["配置Alpine镜像源
阿里云"] +Repos --> Install["安装系统依赖
tzdata, curl, git"] +Install --> Cert["下载并安装
Comodo AAA证书"] +Cert --> User["创建非root用户
appuser"] +User --> Workdir["创建工作目录
/app"] +Workdir --> SwitchUser["切换到appuser"] +SwitchUser --> CopyMod["复制go.mod/go.sum"] +CopyMod --> Download["预下载Go依赖
go mod download"] +Download --> Label["添加镜像标签"] +Label --> End([基础镜像构建完成]) +``` + +**Diagram sources** +- [Dockerfile.base](file://kami-gateway/Dockerfile.base#L1-L59) + +**Section sources** +- [Dockerfile.base](file://kami-gateway/Dockerfile.base#L1-L59) + +### build-base-image.sh 脚本分析 +该脚本自动化了基础镜像的构建、标记和推送流程,是实现 CI/CD 集成的关键。 + +#### 环境变量控制 +脚本通过 `REGISTRY="${DOCKER_REGISTRY:-git.oceanpay.cc/danial}"` 和 `VERSION="${VERSION:-latest}"` 读取环境变量,允许用户在调用时动态指定镜像仓库地址和版本标签。若未指定,则使用默认值。 + +#### 构建与标记 +使用 `docker build` 命令,基于 `Dockerfile.base` 构建镜像,并同时打上 `$VERSION` 和 `latest` 两个标签。如果指定了非本地仓库(`REGISTRY` 不为 `localhost:5000`),则会使用 `docker tag` 命令为镜像添加仓库前缀。 + +#### 推送逻辑 +脚本包含条件推送逻辑:只有当 `REGISTRY` 不是 `localhost:5000` 时,才会执行 `docker push` 将镜像推送到远程仓库。这避免了在本地开发测试时不必要的网络操作。 + +```mermaid +flowchart LR +A[开始] --> B{读取环境变量
DOCKER_REGISTRY, VERSION} +B --> C[构建基础镜像
docker build] +C --> D{REGISTRY != localhost:5000?} +D --> |是| E[标记镜像
docker tag] +D --> |否| F[跳过标记] +E --> G[推送镜像
docker push] +F --> H[完成] +G --> H +H --> I[显示镜像大小] +``` + +**Diagram sources** +- [build-base-image.sh](file://kami-gateway/build-base-image.sh#L1-L51) + +**Section sources** +- [build-base-image.sh](file://kami-gateway/build-base-image.sh#L1-L51) + +### 依赖管理分析 +`go.mod` 文件定义了 kami-gateway 基础镜像所预下载的所有 Go 依赖。这些依赖涵盖了 Web 框架(beego)、JSON 处理(sonic)、数据库驱动(mysql)、Redis 客户端(go-redis)、OpenTelemetry 监控、日志(zap)等网关服务常用组件。 + +#### 最佳实践 +- **明确指定 Go 版本**:`go 1.24.0` 和 `toolchain go1.24.6` 确保了构建环境的一致性。 +- **区分直接与间接依赖**:`require` 块清晰地分开了项目直接依赖和间接依赖,便于维护。 +- **使用国内代理**:`GOPROXY=https://goproxy.cn,direct` 的配置在 `Dockerfile.base` 中生效,极大提升了依赖下载速度。 + +**Section sources** +- [go.mod](file://kami-gateway/go.mod#L1-L82) + +### Dockerfile.improved 多阶段构建 +虽然 `Dockerfile.improved` 未在当前上下文中提供完整内容,但根据 `README.md` 的描述,它采用了多阶段构建策略。 + +#### 优化原理 +第一阶段使用 `kami-gateway-base:latest` 作为基础镜像进行代码编译,利用其预下载的依赖和完整的 Go 环境。第二阶段则使用一个极小的运行时镜像(如 `alpine` 或 `scratch`),仅将第一阶段编译出的二进制文件复制进去。这种方式将最终镜像体积降至最低,同时保证了构建速度。 + +**Section sources** +- [README.md](file://kami-gateway/README.md#L8-L9) + +## 依赖分析 +kami-gateway 模块的依赖关系清晰,主要依赖于 Go 官方镜像和 Alpine Linux 发行版。其内部组件通过 `Dockerfile.base` 和 `build-base-image.sh` 协同工作,形成一个自包含的构建单元。 + +```mermaid +graph TD +A[kami-gateway] --> B[golang:1.25-alpine] +A --> C[Alpine Linux] +A --> D[阿里云镜像源] +A --> E[Comodo AAA证书] +B --> F[Go 1.25工具链] +C --> G[轻量级Linux内核] +D --> H[加速apk包下载] +E --> I[解决证书信任] +``` + +**Diagram sources** +- [Dockerfile.base](file://kami-gateway/Dockerfile.base#L4-L34) + +**Section sources** +- [Dockerfile.base](file://kami-gateway/Dockerfile.base#L1-L59) + +## 性能考量 +kami-gateway 模块在性能方面进行了多项优化: +- **构建速度**:通过预下载 Go 依赖,将应用构建时间从分钟级缩短至 10-30 秒。 +- **镜像体积**:基于 Alpine Linux 和多阶段构建,确保最终运行镜像尽可能小。 +- **网络效率**:使用国内镜像源和代理,减少网络延迟。 + +## 故障排除指南 +- **构建失败**:检查 `go.mod` 文件是否正确,确保所有依赖均可通过 `goproxy.cn` 下载。 +- **推送失败**:确认 `DOCKER_REGISTRY` 环境变量设置正确,并且已登录到目标镜像仓库。 +- **证书错误**:若遇到 HTTPS 证书问题,可检查 `Dockerfile.base` 中的证书下载 URL 是否有效。 + +**Section sources** +- [build-base-image.sh](file://kami-gateway/build-base-image.sh#L35-L39) +- [Dockerfile.base](file://kami-gateway/Dockerfile.base#L33-L34) + +## 结论 +kami-gateway 模块通过精心设计的 `Dockerfile.base` 和 `build-base-image.sh` 脚本,成功构建了一个高效、安全、易用的 Go 语言网关服务基础镜像。其预下载依赖、国内镜像源、非 root 用户运行等特性,不仅显著提升了构建效率,也增强了应用的安全性。结合 Drone CI 的自动化构建流程,该模块为 API 网关微服务的持续集成与交付提供了坚实的基础。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/项目概述/kami-gateway 模块/基础镜像构建.md b/.qoder/repowiki/zh/content/项目概述/kami-gateway 模块/基础镜像构建.md new file mode 100644 index 0000000..9e92514 --- /dev/null +++ b/.qoder/repowiki/zh/content/项目概述/kami-gateway 模块/基础镜像构建.md @@ -0,0 +1,247 @@ +# 基础镜像构建 + + +**Referenced Files in This Document** +- [Dockerfile.base](file://kami-gateway/Dockerfile.base) +- [build-base-image.sh](file://kami-gateway/build-base-image.sh) +- [go.mod](file://kami-gateway/go.mod) +- [alpine-base/build-base-image.sh](file://alpine-base/build-base-image.sh) +- [alpine-base/README.md](file://alpine-base/README.md) +- [kami-gateway/README.md](file://kami-gateway/README.md) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概述](#架构概述) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) + +## 简介 +本文档详细说明了 `kami-gateway` 模块中 `Dockerfile.base` 的构建逻辑,重点描述如何基于 `alpine-base` 创建轻量级 Go 1.25 编译环境。文档涵盖了多阶段构建策略、goproxy.cn 代理配置机制、动态镜像标签生成与私有仓库推送等关键技术点,为开发者提供完整的构建指导和最佳实践。 + +## 项目结构 +项目结构清晰地组织了不同模块的基础镜像构建文件,包括 `alpine-base`、`kami-gateway` 和 `kami-spider-monorepo` 三个主要目录,每个目录包含相应的构建脚本和配置文件。 + +```mermaid +graph TD +A[项目根目录] --> B[alpine-base] +A --> C[kami-gateway] +A --> D[kami-spider-monorepo] +B --> B1[Dockerfile.base] +B --> B2[build-base-image.sh] +B --> B3[README.md] +C --> C1[Dockerfile.base] +C --> C2[build-base-image.sh] +C --> C3[go.mod] +C --> C4[go.sum] +C --> C5[README.md] +D --> D1[build-base-image.sh] +D --> D2[pyproject.toml] +D --> D3[uv.lock] +D --> D4[README.md] +``` + +**Diagram sources** +- [alpine-base/README.md](file://alpine-base/README.md) +- [kami-gateway/README.md](file://kami-gateway/README.md) + +**Section sources** +- [alpine-base/README.md](file://alpine-base/README.md#L1-L70) +- [kami-gateway/README.md](file://kami-gateway/README.md#L1-L60) + +## 核心组件 +`kami-gateway` 模块的核心组件包括 `Dockerfile.base` 和 `build-base-image.sh` 脚本,它们共同实现了轻量级 Go 编译环境的构建和部署。 + +**Section sources** +- [Dockerfile.base](file://kami-gateway/Dockerfile.base#L1-L59) +- [build-base-image.sh](file://kami-gateway/build-base-image.sh#L1-L51) + +## 架构概述 +`kami-gateway` 基础镜像采用多阶段构建策略,分离构建依赖与运行时环境,显著减小最终镜像体积。架构设计充分利用了 Alpine Linux 的轻量化特性,并通过预配置优化了中国网络环境下的依赖下载速度。 + +```mermaid +graph TD +A[基础镜像构建] --> B[Go 1.25 环境] +A --> C[Alpine 运行时] +A --> D[中国镜像源] +A --> E[非 root 用户] +B --> F[Go 模块预下载] +C --> G[轻量级容器] +D --> H[goproxy.cn 代理] +E --> I[appuser 用户] +F --> J[快速构建] +G --> K[小体积镜像] +H --> L[加速依赖下载] +I --> M[安全运行] +``` + +**Diagram sources** +- [Dockerfile.base](file://kami-gateway/Dockerfile.base#L4-L59) +- [build-base-image.sh](file://kami-gateway/build-base-image.sh#L1-L51) + +## 详细组件分析 + +### Dockerfile.base 分析 +`Dockerfile.base` 定义了 `kami-gateway` 应用的基础镜像,基于 `golang:1.25-alpine` 构建,包含 Go 1.25 编译环境和 Alpine 运行时。 + +#### 多阶段构建策略 +```mermaid +flowchart TD +Start([开始构建]) --> BaseImage["FROM golang:1.25-alpine"] +BaseImage --> EnvSetup["设置环境变量"] +EnvSetup --> MirrorConfig["配置中国镜像源"] +MirrorConfig --> InstallDeps["安装依赖包"] +InstallDeps --> CertSetup["下载自定义证书"] +CertSetup --> UserSetup["创建非 root 用户"] +UserSetup --> AppDir["创建应用目录"] +AppDir --> SwitchUser["切换到 appuser 用户"] +SwitchUser --> SetWorkDir["设置工作目录 /app"] +SetWorkDir --> CopyGoMod["复制 go.mod 和 go.sum"] +CopyGoMod --> DownloadDeps["预下载 Go 依赖"] +DownloadDeps --> LabelImage["标记镜像信息"] +LabelImage --> End([基础镜像构建完成]) +``` + +**Diagram sources** +- [Dockerfile.base](file://kami-gateway/Dockerfile.base#L4-L59) + +**Section sources** +- [Dockerfile.base](file://kami-gateway/Dockerfile.base#L1-L59) + +#### 环境变量配置 +`Dockerfile.base` 中配置了多个关键环境变量,确保构建环境的一致性和可重复性: + +| 环境变量 | 值 | 说明 | +|---------|-----|------| +| TZ | Asia/Shanghai | 设置时区为上海 | +| GO111MODULE | on | 启用 Go 模块 | +| GOPROXY | https://goproxy.cn,direct | 配置中国代理 | +| CGO_ENABLED | 0 | 禁用 CGO | +| GOOS | linux | 目标操作系统 | +| GOARCH | amd64 | 目标架构 | + +**Section sources** +- [Dockerfile.base](file://kami-gateway/Dockerfile.base#L7-L12) + +### build-base-image.sh 脚本分析 +`build-base-image.sh` 脚本实现了基础镜像的自动化构建、标记和推送流程。 + +#### 动态镜像标签生成 +```mermaid +sequenceDiagram +participant User as 用户 +participant Script as build-base-image.sh +participant Docker as Docker Engine +User->>Script : 执行脚本 +Script->>Script : 读取 DOCKER_REGISTRY 和 VERSION 环境变量 +Script->>Script : 设置镜像名称和版本 +Script->>Docker : docker build --tag ... +Docker-->>Script : 返回构建结果 +Script->>Script : 判断是否需要推送 +Script->>Docker : docker tag ... +Script->>Docker : docker push ... +Docker-->>Script : 返回推送结果 +Script->>User : 显示构建完成信息和镜像大小 +``` + +**Diagram sources** +- [build-base-image.sh](file://kami-gateway/build-base-image.sh#L1-L51) + +**Section sources** +- [build-base-image.sh](file://kami-gateway/build-base-image.sh#L1-L51) + +#### 构建流程说明 +1. **环境准备**:脚本首先设置 `set -e` 确保任何命令失败时立即退出 +2. **变量配置**:定义 `BASE_IMAGE_NAME`、`REGISTRY` 和 `VERSION` 变量 +3. **镜像构建**:使用 `docker build` 命令构建基础镜像 +4. **标签处理**:为镜像创建版本标签和 latest 标签 +5. **推送注册表**:如果指定了非本地注册表,则推送镜像 +6. **结果展示**:显示构建完成信息和镜像大小 + +**Section sources** +- [build-base-image.sh](file://kami-gateway/build-base-image.sh#L1-L51) + +## 依赖分析 +`kami-gateway` 基础镜像的依赖关系清晰,通过 `go.mod` 文件管理所有 Go 依赖包。 + +```mermaid +erDiagram +DOCKERFILE_BASE { +string FROM +string ENV +string RUN +string COPY +string USER +string WORKDIR +string LABEL +} +GO_MOD { +string module +string go +string toolchain +string require +} +BUILD_SCRIPT { +string BASE_IMAGE_NAME +string REGISTRY +string VERSION +string docker_build +string docker_tag +string docker_push +} +DOCKERFILE_BASE ||--o{ GO_MOD : "复制" +DOCKERFILE_BASE ||--o{ BUILD_SCRIPT : "构建" +BUILD_SCRIPT }|--|| DOCKERFILE_BASE : "使用" +``` + +**Diagram sources** +- [Dockerfile.base](file://kami-gateway/Dockerfile.base#L1-L59) +- [go.mod](file://kami-gateway/go.mod#L1-L82) +- [build-base-image.sh](file://kami-gateway/build-base-image.sh#L1-L51) + +**Section sources** +- [go.mod](file://kami-gateway/go.mod#L1-L82) + +## 性能考虑 +`kami-gateway` 基础镜像在性能方面进行了多项优化: + +1. **构建时间优化**:通过预下载 Go 依赖包,应用构建时间缩短至 10-30 秒 +2. **镜像体积优化**:基于 Alpine Linux,最终镜像体积小 +3. **网络性能优化**:使用中国镜像源和 goproxy.cn 代理,显著提升依赖下载速度 +4. **缓存利用**:基础镜像缓存,避免重复构建 + +**Section sources** +- [kami-gateway/README.md](file://kami-gateway/README.md#L47-L52) + +## 故障排除指南 +### 常见问题及解决方案 + +| 问题现象 | 可能原因 | 解决方案 | +|--------|--------|--------| +| 依赖下载缓慢 | 未使用中国镜像源 | 确认 `GOPROXY` 设置为 `https://goproxy.cn,direct` | +| 构建失败 | 网络连接问题 | 检查网络连接,尝试使用代理 | +| 镜像推送失败 | 注册表认证问题 | 确认 Docker 已登录目标注册表 | +| 证书验证失败 | 自定义证书未正确安装 | 检查证书下载和更新命令 | +| 权限错误 | 未正确切换用户 | 确认 `USER appuser` 命令已执行 | + +**Section sources** +- [Dockerfile.base](file://kami-gateway/Dockerfile.base#L33-L34) +- [build-base-image.sh](file://kami-gateway/build-base-image.sh#L35-L39) + +### 本地测试流程 +1. **环境准备**:确保已安装 Docker 和必要的构建工具 +2. **克隆代码**:获取 `kami-gateway` 仓库代码 +3. **构建镜像**:执行 `./build-base-image.sh` +4. **验证镜像**:使用 `docker images` 查看镜像信息 +5. **测试运行**:创建测试容器验证基础环境 + +**Section sources** +- [build-base-image.sh](file://kami-gateway/build-base-image.sh#L1-L51) + +## 结论 +`kami-gateway` 的 `Dockerfile.base` 通过多阶段构建策略、中国网络环境优化和安全配置,成功创建了一个轻量级、高性能的 Go 1.25 编译环境。`build-base-image.sh` 脚本实现了自动化构建和部署,为团队提供了高效的开发体验。该基础镜像设计合理,性能优越,是微服务架构中理想的构建基础。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/项目概述/kami-gateway 模块/应用镜像构建指南.md b/.qoder/repowiki/zh/content/项目概述/kami-gateway 模块/应用镜像构建指南.md new file mode 100644 index 0000000..1e917e9 --- /dev/null +++ b/.qoder/repowiki/zh/content/项目概述/kami-gateway 模块/应用镜像构建指南.md @@ -0,0 +1,194 @@ +# 应用镜像构建指南 + + +**本文档中引用的文件** +- [Dockerfile.base](file://kami-gateway/Dockerfile.base) +- [build-base-image.sh](file://kami-gateway/build-base-image.sh) +- [go.mod](file://kami-gateway/go.mod) +- [go.sum](file://kami-gateway/go.sum) +- [README.md](file://kami-gateway/README.md) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概述](#架构概述) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) + +## 简介 +本文档提供从 `kami-gateway-base` 基础镜像到实际 API 网关服务镜像的完整构建指南。涵盖如何在应用项目的 Dockerfile 中继承基础镜像,复用预置的 Go 编译环境与依赖缓存以实现极速构建,以及多阶段构建、运行时配置、安全实践等最佳实践。 + +## 项目结构 +`kami-gateway` 目录包含构建基础镜像所需的核心文件,包括 Dockerfile、构建脚本和 Go 模块配置。该基础镜像专为 Go 应用设计,预置了编译环境和依赖,旨在加速应用镜像的构建过程。 + +```mermaid +graph TD +A[kami-gateway/] --> B[Dockerfile.base] +A --> C[build-base-image.sh] +A --> D[go.mod] +A --> E[go.sum] +A --> F[README.md] +``` + +**图示来源** +- [Dockerfile.base](file://kami-gateway/Dockerfile.base) +- [build-base-image.sh](file://kami-gateway/build-base-image.sh) +- [README.md](file://kami-gateway/README.md) + +**章节来源** +- [README.md](file://kami-gateway/README.md) + +## 核心组件 +`kami-gateway` 基础镜像的核心组件包括:基于 `golang:1.25-alpine` 的编译环境、预下载的 Go 依赖包、中国镜像源配置、时区与证书设置,以及非 root 用户运行支持。这些组件共同实现了快速、安全、可复用的构建基础。 + +**章节来源** +- [Dockerfile.base](file://kami-gateway/Dockerfile.base#L1-L59) +- [go.mod](file://kami-gateway/go.mod#L1-L82) +- [README.md](file://kami-gateway/README.md#L34-L40) + +## 架构概述 +`kami-gateway` 的镜像构建采用分层架构。基础镜像(`kami-gateway-base`)封装了通用的 Go 编译环境和依赖。应用镜像则通过 `FROM` 指令继承此基础镜像,在此基础上编译应用代码并进行运行时配置,最终形成一个轻量、安全的生产级镜像。 + +```mermaid +graph LR +subgraph "应用镜像构建阶段" +A[应用代码] --> B[Dockerfile.improved] +B --> C[编译二进制] +C --> D[精简运行时镜像] +end +subgraph "基础镜像层" +E[golang:1.25-alpine] --> F[kami-gateway-base] +F --> |继承| B +end +style F fill:#f9f,stroke:#333 +style D fill:#bbf,stroke:#333 +``` + +**图示来源** +- [Dockerfile.base](file://kami-gateway/Dockerfile.base#L4-L59) +- [README.md](file://kami-gateway/README.md#L7-L8) + +## 详细组件分析 + +### 基础镜像构建分析 +`Dockerfile.base` 定义了 `kami-gateway-base` 镜像的构建过程。它从官方 Go 镜像开始,优化了国内网络环境下的依赖下载,并预下载了所有 Go 模块,从而在应用构建阶段避免了耗时的 `go mod download` 步骤。 + +```mermaid +flowchart TD +Start([开始]) --> SetEnv["设置环境变量
GO111MODULE=on
GOPROXY=https://goproxy.cn"] +SetEnv --> ConfigureAlpine["配置 Alpine 镜像源
使用阿里云镜像"] +ConfigureAlpine --> InstallDeps["安装系统依赖
tzdata, ca-certificates, git"] +InstallDeps --> SetupTimezone["设置时区为 Asia/Shanghai"] +SetupTimezone --> AddCerts["添加自定义证书"] +AddCerts --> CreateUser["创建非 root 用户 appuser"] +CreateUser --> CreateAppDir["创建应用目录 /app"] +CreateAppDir --> SwitchUser["切换到 appuser 用户"] +SwitchUser --> CopyGoFiles["复制 go.mod 和 go.sum"] +CopyGoFiles --> PreDownload["预下载 Go 依赖
go mod download && verify"] +PreDownload --> LabelImage["为镜像添加标签"] +LabelImage --> End([基础镜像构建完成]) +``` + +**图示来源** +- [Dockerfile.base](file://kami-gateway/Dockerfile.base#L1-L59) + +**章节来源** +- [Dockerfile.base](file://kami-gateway/Dockerfile.base#L1-L59) +- [README.md](file://kami-gateway/README.md#L34-L39) + +### 应用镜像构建流程 +应用镜像的构建流程分为两个阶段:第一阶段使用 `kami-gateway-base` 编译二进制文件,第二阶段基于一个极简的运行时镜像(如 `distroless`)打包,仅包含运行应用所需的文件,从而显著减小最终镜像体积。 + +```mermaid +sequenceDiagram +participant Dev as 开发者 +participant BuildScript as build-base-image.sh +participant Docker as Docker Engine +participant Registry as 镜像仓库 +Dev->>BuildScript : 执行 ./build-base-image.sh +BuildScript->>Docker : docker build --file Dockerfile.base ... +Docker->>Docker : 构建 kami-gateway-base 镜像 +Docker-->>BuildScript : 构建成功 +BuildScript->>BuildScript : 为镜像打标签 +alt 指定了镜像仓库 +BuildScript->>Docker : docker tag ... +BuildScript->>Docker : docker push ... +Docker-->>Registry : 推送镜像 +Registry-->>BuildScript : 推送成功 +end +BuildScript->>Dev : 构建完成,镜像可用 +``` + +**图示来源** +- [build-base-image.sh](file://kami-gateway/build-base-image.sh#L1-L51) +- [Dockerfile.base](file://kami-gateway/Dockerfile.base#L20-L24) + +**章节来源** +- [build-base-image.sh](file://kami-gateway/build-base-image.sh#L1-L51) +- [README.md](file://kami-gateway/README.md#L14-L21) + +## 依赖分析 +`kami-gateway` 基础镜像的依赖主要分为两部分:系统依赖和 Go 模块依赖。系统依赖通过 `apk add` 安装,包括时区数据、证书和 Git。Go 模块依赖则通过 `go mod download` 预先下载,其具体版本由 `go.mod` 和 `go.sum` 文件精确锁定,确保了构建的可重现性。 + +```mermaid +erDiagram +BASE_IMAGE ||--o{ SYSTEM_DEPS : "包含" +BASE_IMAGE ||--o{ GO_DEPS : "包含" +BASE_IMAGE ||--o{ CONFIG : "包含" +SYSTEM_DEPS { +string package_name PK +string version +string purpose +} +GO_DEPS { +string module_name PK +string version +string checksum +} +CONFIG { +string config_type PK +string value +string description +} +SYSTEM_DEPS }o--|| BASE_IMAGE : "系统依赖" +GO_DEPS }o--|| BASE_IMAGE : "Go依赖" +CONFIG }o--|| BASE_IMAGE : "配置项" +``` + +**图示来源** +- [Dockerfile.base](file://kami-gateway/Dockerfile.base#L19-L30) +- [go.mod](file://kami-gateway/go.mod#L1-L82) +- [Dockerfile.base](file://kami-gateway/Dockerfile.base#L7-L12) + +**章节来源** +- [go.mod](file://kami-gateway/go.mod#L1-L82) +- [Dockerfile.base](file://kami-gateway/Dockerfile.base#L19-L34) + +## 性能考虑 +使用 `kami-gateway-base` 的主要性能优势在于**极速构建**。由于基础镜像已预置了 Go 编译环境和所有依赖,应用构建阶段的耗时从数分钟缩短至 10-30 秒。此外,多阶段构建确保了最终镜像的精简,减少了网络传输时间和运行时攻击面。 + +**章节来源** +- [README.md](file://kami-gateway/README.md#L48-L52) + +## 故障排除指南 +- **问题:构建时无法下载 Go 模块** + - **原因**:网络问题或 GOPROXY 配置错误。 + - **解决**:确认 `Dockerfile.base` 中的 `GOPROXY` 设置为 `https://goproxy.cn,direct`。 +- **问题:镜像推送失败** + - **原因**:未登录镜像仓库或 `DOCKER_REGISTRY` 环境变量设置错误。 + - **解决**:执行 `docker login git.oceanpay.cc` 并检查 `build-base-image.sh` 脚本中的 `REGISTRY` 变量。 +- **问题:容器启动失败,权限错误** + - **原因**:未正确创建非 root 用户或文件权限问题。 + - **解决**:检查 `Dockerfile.base` 中 `addgroup`、`adduser` 和 `chown` 命令的执行。 + +**章节来源** +- [build-base-image.sh](file://kami-gateway/build-base-image.sh#L27-L30) +- [Dockerfile.base](file://kami-gateway/Dockerfile.base#L37-L42) + +## 结论 +`kami-gateway-base` 镜像通过预置环境和依赖,为 Go 应用提供了一个高效、安全的构建基础。通过遵循本文档的指南,开发者可以快速构建出轻量、安全且符合最佳实践的应用镜像,显著提升 CI/CD 流程的效率。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/项目概述/kami-spider-monorepo 模块.md b/.qoder/repowiki/zh/content/项目概述/kami-spider-monorepo 模块.md new file mode 100644 index 0000000..1d472bd --- /dev/null +++ b/.qoder/repowiki/zh/content/项目概述/kami-spider-monorepo 模块.md @@ -0,0 +1,160 @@ +# 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 技术实现](#dockerfilebase-技术实现) +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 依赖包**:包含了项目所需的所有第三方库,如 FastAPI(Web 框架)、SQLAlchemy(数据库 ORM)、Redis(缓存)、Pandas(数据处理)等,极大减少了应用镜像的构建时间和复杂性。 +- **系统级运行时库**:安装了 Playwright 运行所需的系统依赖,如字体库、图形库(libnss3, libatk-bridge2.0-0 等),确保浏览器在容器内稳定运行。 +- **非 root 用户配置**:遵循最小权限原则,应用在非 root 用户(`appuser`)下运行,显著提升了容器的安全性。 + +**Section sources** +- [README.md](file://kami-spider-monorepo/README.md#L25-L34) + +## 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.toml` 和 `uv.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** +- [Dockerfile.base](file://kami-spider-monorepo/Dockerfile.base#L1-L87) + +## 依赖管理与可重现构建 +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` 文件,安装的依赖包版本将完全一致,彻底消除了“在我机器上能运行”的问题。 + +```mermaid +flowchart TD +A["pyproject.toml\n(声明依赖范围)"] --> B["uv sync\n(解析依赖)"] +B --> C["uv.lock\n(锁定精确版本)"] +C --> D["安装依赖\n(可重现构建)"] +``` + +**Diagram sources** +- [pyproject.toml](file://kami-spider-monorepo/pyproject.toml#L1-L49) +- [uv.lock](file://kami-spider-monorepo/uv.lock#L1-L647) + +**Section sources** +- [pyproject.toml](file://kami-spider-monorepo/pyproject.toml#L1-L49) +- [uv.lock](file://kami-spider-monorepo/uv.lock#L1-L647) + +## 构建脚本与代理支持 +`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** +- [build-base-image.sh](file://kami-spider-monorepo/build-base-image.sh#L1-L54) + +## 构建命令与工作流程 +以下是使用 kami-spider 基础镜像的完整工作流程和命令示例。 + +### 构建命令 +```bash +# 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** +- [README.md](file://kami-spider-monorepo/README.md#L12-L23) +- [build-base-image.sh](file://kami-spider-monorepo/build-base-image.sh#L1-L54) + +## 安全实践与性能优化 +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** +- [Dockerfile.base](file://kami-spider-monorepo/Dockerfile.base#L4-L14) +- [Dockerfile.base](file://kami-spider-monorepo/Dockerfile.base#L41-L47) +- [Dockerfile.base](file://kami-spider-monorepo/Dockerfile.base#L49) +- [Dockerfile.base](file://kami-spider-monorepo/Dockerfile.base#L10-L11) + +## 高级部署与最佳实践 +为了在大规模爬虫部署中发挥 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** +- [build-base-image.sh](file://kami-spider-monorepo/build-base-image.sh#L30-L33) +- [pyproject.toml](file://kami-spider-monorepo/pyproject.toml#L20-L27) \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/项目概述/项目概述.md b/.qoder/repowiki/zh/content/项目概述/项目概述.md new file mode 100644 index 0000000..b6d1ded --- /dev/null +++ b/.qoder/repowiki/zh/content/项目概述/项目概述.md @@ -0,0 +1,261 @@ +# 项目概述 + + +**本文档引用的文件** +- [alpine-base/README.md](file://alpine-base/README.md) +- [kami-gateway/README.md](file://kami-gateway/README.md) +- [kami-spider-monorepo/README.md](file://kami-spider-monorepo/README.md) +- [alpine-base/build-base-image.sh](file://alpine-base/build-base-image.sh) +- [kami-gateway/build-base-image.sh](file://kami-gateway/build-base-image.sh) +- [kami-spider-monorepo/build-base-image.sh](file://kami-spider-monorepo/build-base-image.sh) +- [alpine-base/Dockerfile.base](file://alpine-base/Dockerfile.base) +- [kami-gateway/Dockerfile.base](file://kami-gateway/Dockerfile.base) +- [kami-spider-monorepo/Dockerfile.base](file://kami-spider-monorepo/Dockerfile.base) + + +## 目录 +1. [项目简介](#项目简介) +2. [项目结构](#项目结构) +3. [核心模块分析](#核心模块分析) +4. [架构设计](#架构设计) +5. [构建流程与使用方法](#构建流程与使用方法) +6. [安全与优化实践](#安全与优化实践) +7. [CI/CD集成](#cicd集成) +8. [总结](#总结) + +## 项目简介 + +`docker-registry` 项目是一个为不同技术栈提供优化基础镜像的容器化构建系统。该项目通过三个核心模块——`alpine-base`、`kami-gateway` 和 `kami-spider-monorepo`,为 Alpine、Go 和 Python 技术栈提供高度优化的 Docker 基础镜像。其核心设计理念是通过分层继承、构建脚本复用和非 root 安全运行机制,实现快速、安全、一致的容器化部署。 + +该项目的主要功能包括: +- **加速镜像构建**:通过预下载依赖和缓存基础层,显著缩短构建时间 +- **统一开发环境**:为团队提供一致的运行时环境,避免“在我机器上能运行”的问题 +- **中国镜像源优化**:配置阿里云等国内镜像源,大幅提升依赖下载速度 +- **自定义证书集成**:预装 Comodo AAA 证书,解决特定环境下的 SSL/TLS 信任问题 +- **轻量化设计**:基于 Alpine Linux 和 slim 镜像,保持最小化体积 + +在微服务架构中,这些基础镜像作为所有服务的共同起点,确保了技术栈的一致性、安全性和部署效率。 + +## 项目结构 + +项目采用模块化设计,每个技术栈拥有独立的目录,包含其特定的构建文件和配置。 + +```mermaid +graph TD +A[docker-registry] --> B[alpine-base] +A --> C[kami-gateway] +A --> D[kami-spider-monorepo] +B --> B1[README.md] +B --> B2[build-base-image.sh] +B --> B3[Dockerfile.base] +C --> C1[README.md] +C --> C2[build-base-image.sh] +C --> C3[Dockerfile.base] +C --> C4[go.mod] +C --> C5[go.sum] +D --> D1[README.md] +D --> D2[build-base-image.sh] +D --> D3[Dockerfile.base] +D --> D4[pyproject.toml] +D --> D5[uv.lock] +``` + +**Diagram sources** +- [alpine-base/README.md](file://alpine-base/README.md) +- [kami-gateway/README.md](file://kami-gateway/README.md) +- [kami-spider-monorepo/README.md](file://kami-spider-monorepo/README.md) + +**Section sources** +- [alpine-base/README.md](file://alpine-base/README.md) +- [kami-gateway/README.md](file://kami-gateway/README.md) +- [kami-spider-monorepo/README.md](file://kami-spider-monorepo/README.md) + +## 核心模块分析 + +### alpine-base 模块 + +`alpine-base` 模块是整个项目的基础,为所有其他镜像提供一个优化的 Alpine Linux 运行时环境。 + +**核心特性**: +- **基础镜像**:基于 `alpine:latest`,保证了最小化体积(约 50MB) +- **中国镜像源**:配置阿里云镜像源,加速 `apk` 包管理器的下载速度 +- **时区配置**:默认设置为 `Asia/Shanghai` +- **预装工具**:包含 `curl`、`wget`、`git`、`bash` 等常用工具 +- **安全机制**:创建非 root 用户 `appuser` (UID: 1001),强制应用以最小权限运行 +- **证书管理**:预装 CA 证书和 Comodo AAA 自定义证书 + +该模块生成的镜像标记为 `alpine-base:latest`,可作为其他自定义镜像的基础。 + +**Section sources** +- [alpine-base/README.md](file://alpine-base/README.md) +- [alpine-base/Dockerfile.base](file://alpine-base/Dockerfile.base) +- [alpine-base/build-base-image.sh](file://alpine-base/build-base-image.sh) + +### kami-gateway 模块 + +`kami-gateway` 模块专为 Go 语言应用设计,构建了一个包含 Go 1.25 编译环境和 Alpine 运行时的完整基础镜像。 + +**核心特性**: +- **Go 编译环境**:基于 `golang:1.25-alpine`,提供完整的 Go 开发工具链 +- **依赖预下载**:在构建过程中执行 `go mod download`,缓存所有依赖,使后续应用构建时间缩短至 10-30 秒 +- **中国镜像源**:配置 `GOPROXY=https://goproxy.cn,direct`,加速 Go 模块下载 +- **安全运行**:同样使用非 root 用户 `appuser` 运行应用 +- **多阶段构建**:虽然未在基础镜像中体现,但其设计支持通过 `Dockerfile.improved` 实现多阶段构建以优化最终镜像 + +该模块生成的镜像标记为 `kami-gateway-base:latest`。 + +**Section sources** +- [kami-gateway/README.md](file://kami-gateway/README.md) +- [kami-gateway/Dockerfile.base](file://kami-gateway/Dockerfile.base) +- [kami-gateway/build-base-image.sh](file://kami-gateway/build-base-image.sh) + +### kami-spider-monorepo 模块 + +`kami-spider-monorepo` 模块为 Python 应用,特别是网络爬虫类应用,提供了一个功能完备的基础镜像。 + +**核心特性**: +- **Python 运行时**:基于 `python:3.13-slim`,平衡了功能和体积 +- **UV 包管理器**:使用现代的 `uv` 工具替代 `pip`,显著提升依赖安装速度 +- **Playwright 支持**:预装 Playwright 运行时库和 Chromium 浏览器,开箱即用 +- **系统依赖**:安装了 Playwright 所需的所有系统级库(如 `libnss3`、`libatk-bridge2.0-0` 等) +- **代理支持**:通过 `USE_PROXY` 构建参数,支持使用清华源等国内镜像加速 PyPI 包下载 +- **安全配置**:创建非 root 用户 `appuser`,并正确设置文件权限 + +该模块生成的镜像标记为 `kami-spider-base:latest`。 + +**Section sources** +- [kami-spider-monorepo/README.md](file://kami-spider-monorepo/README.md) +- [kami-spider-monorepo/Dockerfile.base](file://kami-spider-monorepo/Dockerfile.base) +- [kami-spider-monorepo/build-base-image.sh](file://kami-spider-monorepo/build-base-image.sh) + +## 架构设计 + +该项目的架构设计体现了清晰的分层和继承思想。 + +```mermaid +graph TD +subgraph "基础层" +A[alpine:latest] --> B[alpine-base:latest] +end +subgraph "技术栈层" +B --> C[golang:1.25-alpine] +C --> D[kami-gateway-base:latest] +B --> E[python:3.13-slim] +E --> F[kami-spider-base:latest] +end +subgraph "应用层" +D --> G[具体 Go 应用镜像] +F --> H[具体 Python 应用镜像] +end +``` + +**Diagram sources** +- [alpine-base/Dockerfile.base](file://alpine-base/Dockerfile.base) +- [kami-gateway/Dockerfile.base](file://kami-gateway/Dockerfile.base) +- [kami-spider-monorepo/Dockerfile.base](file://kami-spider-monorepo/Dockerfile.base) + +**Section sources** +- [alpine-base/Dockerfile.base](file://alpine-base/Dockerfile.base) +- [kami-gateway/Dockerfile.base](file://kami-gateway/Dockerfile.base) +- [kami-spider-monorepo/Dockerfile.base](file://kami-spider-monorepo/Dockerfile.base) + +**设计要点**: +1. **分层继承**:`alpine-base` 作为最底层的通用优化镜像,被 `kami-gateway` 和 `kami-spider-monorepo` 继承,避免了重复配置。 +2. **构建脚本复用**:所有模块的 `build-base-image.sh` 脚本结构高度一致,实现了构建逻辑的标准化。 +3. **环境变量控制**:通过 `DOCKER_REGISTRY`、`VERSION`、`USE_PROXY` 等环境变量,灵活控制构建行为。 +4. **非 root 安全机制**:所有镜像都创建了 `appuser` 用户,强制应用以非特权用户身份运行,提升了容器安全性。 + +## 构建流程与使用方法 + +### 构建流程 + +所有模块的构建流程都通过 `build-base-image.sh` 脚本自动化完成。 + +```mermaid +flowchart TD +Start([开始构建]) --> SetEnv["设置环境变量\n(DOCKER_REGISTRY, VERSION)"] +SetEnv --> Build["执行 docker build"] +Build --> Tag["打标签\n(local 和 registry)"] +Tag --> Push{"是否推送至远程仓库?"} +Push --> |是| PushToRegistry["执行 docker push"] +Push --> |否| SkipPush["跳过推送"] +PushToRegistry --> Complete["构建完成"] +SkipPush --> Complete +Complete --> ShowSize["显示镜像大小"] +ShowSize --> End([结束]) +``` + +**Diagram sources** +- [alpine-base/build-base-image.sh](file://alpine-base/build-base-image.sh) +- [kami-gateway/build-base-image.sh](file://kami-gateway/build-base-image.sh) +- [kami-spider-monorepo/build-base-image.sh](file://kami-spider-monorepo/build-base-image.sh) + +**Section sources** +- [alpine-base/build-base-image.sh](file://alpine-base/build-base-image.sh) +- [kami-gateway/build-base-image.sh](file://kami-gateway/build-base-image.sh) +- [kami-spider-monorepo/build-base-image.sh](file://kami-spider-monorepo/build-base-image.sh) + +### 使用方法 + +#### 构建基础镜像 +```bash +# 构建 alpine-base 镜像 +cd alpine-base && ./build-base-image.sh + +# 构建并推送到指定镜像仓库 +DOCKER_REGISTRY=git.oceanpay.cc/danial ./build-base-image.sh +``` + +#### 在应用中使用 +```Dockerfile +# 使用 alpine-base 作为基础 +FROM git.oceanpay.cc/danial/alpine-base:latest +COPY --chown=appuser:appuser . /app/ +USER appuser +CMD ["./your-app"] +``` + +```Dockerfile +# 使用 kami-gateway-base 作为基础 +FROM git.oceanpay.cc/danial/kami-gateway-base:latest +# 复制源码并构建 +COPY --chown=appuser:appuser . . +RUN go build -o main . +CMD ["./main"] +``` + +## 安全与优化实践 + +### 安全实践 +- **非 root 用户**:所有镜像都创建了 UID 为 1001 的 `appuser`,并通过 `USER` 指令切换,遵循最小权限原则。 +- **文件权限**:应用目录 `/app` 及其内容的所有权被正确设置为 `appuser`。 +- **镜像来源**:基础镜像均来自官方仓库(`alpine`, `golang`, `python`),保证了来源可信。 + +### 优化实践 +- **中国镜像源**:Alpine、Go 和 Python 的依赖下载均配置了国内镜像源,解决了网络延迟问题。 +- **依赖预下载**:Go 模块和 Python 依赖在构建基础镜像时就已下载,避免了每次构建应用时的重复下载。 +- **轻量化**:使用 `--no-cache` 和 `rm -rf` 清理构建缓存,保持镜像体积最小化。 +- **环境变量**:通过 `CGO_ENABLED=0` 等 Go 环境变量,构建静态链接的二进制文件,减少对系统库的依赖。 + +## CI/CD集成 + +`kami-gateway` 模块明确提到了使用 Drone CI 进行自动化构建。其 CI/CD 流程如下: +1. **触发条件**:检测到 `kami-gateway/` 目录下的代码变更。 +2. **自动构建**:CI 系统自动执行 `build-base-image.sh` 脚本。 +3. **条件推送**:根据配置,将新构建的 `kami-gateway-base:latest` 镜像推送到远程镜像仓库。 +4. **资源优化**:采用条件构建策略,避免不必要的资源消耗。 + +这种自动化流程确保了基础镜像的及时更新和一致性,是 DevOps 实践的重要组成部分。 + +**Section sources** +- [kami-gateway/README.md](file://kami-gateway/README.md) + +## 总结 + +`docker-registry` 项目通过精心设计的模块化架构,为不同技术栈提供了高效、安全、一致的基础镜像解决方案。其核心价值在于: +- **提升效率**:通过预构建和缓存,将应用构建时间从分钟级缩短到秒级。 +- **保障安全**:强制非 root 用户运行,降低了安全风险。 +- **统一环境**:消除了开发、测试、生产环境之间的差异。 +- **优化网络**:针对中国网络环境进行了专门优化。 + +该项目是现代微服务架构中不可或缺的基础设施,为团队的快速迭代和稳定部署提供了坚实的基础。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/meta/repowiki-metadata.json b/.qoder/repowiki/zh/meta/repowiki-metadata.json new file mode 100644 index 0000000..64bae26 --- /dev/null +++ b/.qoder/repowiki/zh/meta/repowiki-metadata.json @@ -0,0 +1 @@ +{"knowledge_relations":[{"id":225,"source_id":"2ecaaf95-655f-4d6d-bb65-5b3a221d0e19","target_id":"adc2875e-7302-4520-9bbd-8a5f67213877","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 2ecaaf95-655f-4d6d-bb65-5b3a221d0e19 -\u003e adc2875e-7302-4520-9bbd-8a5f67213877","gmt_create":"2025-11-09T23:18:39.259063+08:00","gmt_modified":"2025-11-09T23:18:39.259063+08:00"},{"id":226,"source_id":"2ecaaf95-655f-4d6d-bb65-5b3a221d0e19","target_id":"603cb3a2-940c-4fb4-af92-1455c2e842f3","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 2ecaaf95-655f-4d6d-bb65-5b3a221d0e19 -\u003e 603cb3a2-940c-4fb4-af92-1455c2e842f3","gmt_create":"2025-11-09T23:18:39.265039+08:00","gmt_modified":"2025-11-09T23:18:39.265039+08:00"},{"id":227,"source_id":"2ecaaf95-655f-4d6d-bb65-5b3a221d0e19","target_id":"3883b336-0b91-405e-8c5d-fe6b5f98462e","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 2ecaaf95-655f-4d6d-bb65-5b3a221d0e19 -\u003e 3883b336-0b91-405e-8c5d-fe6b5f98462e","gmt_create":"2025-11-09T23:18:39.27175+08:00","gmt_modified":"2025-11-09T23:18:39.27175+08:00"},{"id":228,"source_id":"12203115-71b4-4691-88bf-ab11564b9fe8","target_id":"295c1192-6d0a-4dd0-9d9d-382ac911c205","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 12203115-71b4-4691-88bf-ab11564b9fe8 -\u003e 295c1192-6d0a-4dd0-9d9d-382ac911c205","gmt_create":"2025-11-09T23:18:39.2856+08:00","gmt_modified":"2025-11-09T23:18:39.2856+08:00"},{"id":229,"source_id":"12203115-71b4-4691-88bf-ab11564b9fe8","target_id":"30884903-1b75-4192-845c-61a90fc80d8b","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 12203115-71b4-4691-88bf-ab11564b9fe8 -\u003e 30884903-1b75-4192-845c-61a90fc80d8b","gmt_create":"2025-11-09T23:18:39.292281+08:00","gmt_modified":"2025-11-09T23:18:39.292281+08:00"},{"id":230,"source_id":"12203115-71b4-4691-88bf-ab11564b9fe8","target_id":"958d01c4-a4ce-441a-b1e6-464718390859","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 12203115-71b4-4691-88bf-ab11564b9fe8 -\u003e 958d01c4-a4ce-441a-b1e6-464718390859","gmt_create":"2025-11-09T23:18:39.298686+08:00","gmt_modified":"2025-11-09T23:18:39.298686+08:00"},{"id":231,"source_id":"12203115-71b4-4691-88bf-ab11564b9fe8","target_id":"b75ef0b1-14eb-4602-a372-8bc28c154516","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 12203115-71b4-4691-88bf-ab11564b9fe8 -\u003e b75ef0b1-14eb-4602-a372-8bc28c154516","gmt_create":"2025-11-09T23:18:39.303105+08:00","gmt_modified":"2025-11-09T23:18:39.303105+08:00"},{"id":232,"source_id":"0b98aaa0-f8b6-4519-9e33-da448e5d46bc","target_id":"2a4ff51e-641d-4f66-99fd-c5cf3faf8d68","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 0b98aaa0-f8b6-4519-9e33-da448e5d46bc -\u003e 2a4ff51e-641d-4f66-99fd-c5cf3faf8d68","gmt_create":"2025-11-09T23:18:39.306924+08:00","gmt_modified":"2025-11-09T23:18:39.306924+08:00"},{"id":233,"source_id":"0b98aaa0-f8b6-4519-9e33-da448e5d46bc","target_id":"192594ea-bb47-4a29-b16c-b6782eafb53e","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 0b98aaa0-f8b6-4519-9e33-da448e5d46bc -\u003e 192594ea-bb47-4a29-b16c-b6782eafb53e","gmt_create":"2025-11-09T23:18:39.316533+08:00","gmt_modified":"2025-11-09T23:18:39.316533+08:00"},{"id":234,"source_id":"0b98aaa0-f8b6-4519-9e33-da448e5d46bc","target_id":"8525a571-0ae0-4153-9ba5-23d2de726ef4","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 0b98aaa0-f8b6-4519-9e33-da448e5d46bc -\u003e 8525a571-0ae0-4153-9ba5-23d2de726ef4","gmt_create":"2025-11-09T23:18:39.323598+08:00","gmt_modified":"2025-11-09T23:18:39.323598+08:00"},{"id":235,"source_id":"0b98aaa0-f8b6-4519-9e33-da448e5d46bc","target_id":"b5946ba4-2b1f-431a-b8ea-87a1a62a6dff","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 0b98aaa0-f8b6-4519-9e33-da448e5d46bc -\u003e b5946ba4-2b1f-431a-b8ea-87a1a62a6dff","gmt_create":"2025-11-09T23:18:39.326634+08:00","gmt_modified":"2025-11-09T23:18:39.326634+08:00"},{"id":236,"source_id":"0b98aaa0-f8b6-4519-9e33-da448e5d46bc","target_id":"4044ee70-4d92-48cd-9ea5-f437be453797","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 0b98aaa0-f8b6-4519-9e33-da448e5d46bc -\u003e 4044ee70-4d92-48cd-9ea5-f437be453797","gmt_create":"2025-11-09T23:18:39.32704+08:00","gmt_modified":"2025-11-09T23:18:39.32704+08:00"},{"id":237,"source_id":"603cb3a2-940c-4fb4-af92-1455c2e842f3","target_id":"8cdcf2ee-6ed7-4ab6-96c8-82c39c3df207","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 603cb3a2-940c-4fb4-af92-1455c2e842f3 -\u003e 8cdcf2ee-6ed7-4ab6-96c8-82c39c3df207","gmt_create":"2025-11-09T23:18:39.328467+08:00","gmt_modified":"2025-11-09T23:18:39.328467+08:00"},{"id":238,"source_id":"603cb3a2-940c-4fb4-af92-1455c2e842f3","target_id":"844ce3c6-c207-4f0f-9749-4a97ffb47912","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 603cb3a2-940c-4fb4-af92-1455c2e842f3 -\u003e 844ce3c6-c207-4f0f-9749-4a97ffb47912","gmt_create":"2025-11-09T23:18:39.329358+08:00","gmt_modified":"2025-11-09T23:18:39.329358+08:00"},{"id":239,"source_id":"603cb3a2-940c-4fb4-af92-1455c2e842f3","target_id":"407e4974-151b-443a-958e-bb4048b3a58b","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 603cb3a2-940c-4fb4-af92-1455c2e842f3 -\u003e 407e4974-151b-443a-958e-bb4048b3a58b","gmt_create":"2025-11-09T23:18:39.329733+08:00","gmt_modified":"2025-11-09T23:18:39.329733+08:00"},{"id":240,"source_id":"603cb3a2-940c-4fb4-af92-1455c2e842f3","target_id":"e3d57446-2281-49ee-84bf-50106e329c6e","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 603cb3a2-940c-4fb4-af92-1455c2e842f3 -\u003e e3d57446-2281-49ee-84bf-50106e329c6e","gmt_create":"2025-11-09T23:18:39.330074+08:00","gmt_modified":"2025-11-09T23:18:39.330074+08:00"}],"wiki_catalogs":[{"id":"03f420dc-94ba-4438-939d-b3cbb95856eb","repo_id":"7344f110-a8d0-446b-a0f4-7d8e507bccd2","name":"项目概述","description":"project-overview","prompt":"创建关于docker-registry项目的综合性内容,重点介绍其作为容器化基础镜像构建系统的核心作用。解释该项目如何通过alpine-base、kami-gateway和kami-spider-monorepo三个模块为不同技术栈(Alpine、Go、Python)提供优化的Docker基础镜像。阐述其架构设计理念,包括分层继承、构建脚本复用和非root安全运行机制。详细说明项目的主要功能:加速镜像构建、统一开发环境、中国镜像源优化、自定义证书集成以及轻量化设计。结合代码库中的实际用例,展示各模块之间的关系与协同方式。为初学者提供概念性引导,包括Docker基础、构建流程和安全实践;为高级用户提供技术细节,如环境变量控制、依赖预下载和CI/CD集成。使用项目中真实的镜像名称和标签(如alpine-base:latest、kami-gateway-base:latest)提供实际使用示例,并说明其在微服务架构中的定位与价值。","progress_status":"completed","dependent_files":"alpine-base/README.md,kami-gateway/README.md,kami-spider-monorepo/README.md","gmt_create":"2025-11-09T23:07:27.825653+08:00","gmt_modified":"2025-11-09T23:09:27.674083+08:00","raw_data":"WikiEncrypted:0MI1/XkBoMl0lTbK6t0Cn/+8FdvqrJ62ianMLvZj02elJtBUgH0Ns0veIx1WPtM9wwkxI+/XAqHLxJLlHB8wV64BEQU6fsgKMDP1iJCc20Yj3vryH9o62N7mtzXqaPjik3NnLJEUI5Q1LwKQ5laz6QFH8GBY7IAzRLEZyROHy4YzTF7oiQWO/zUL4hVQW1BRJiC9EwzIzl8I4pvxp+yNbsScgzTEPkrBAvU2ktib91+GF/rAOTsViVXPDi6cR3QTzBhdTlstl80RshnqOQodnUQbF1+CVlj/51m8mKKuwq40Dg9gTyJHLrkFaUrVP2E2GNfbt3oTEXSK4G/BTDpp5a/0hDaK18vJw+tsC8WPPGSsPex9hPUt/rcVsIKt79JY+iSBMCNqy/aSfBOWJYkhxnY5XXosu5pwocOLRm6YQR7ve6MuW4dBZFb8HBolQ0bATVc6uatrdhyWBGcbJsKzMbJOOXAdbtI01S4RJng5Y/TbeJXXEym0Bz6TQ+NfEozVguaI8woKa8ierkE21pp7e6JErDqrqySftnP/5erFKX4U0oSbQumxFb+r03DrsxvGfuvHbc+QFD6RMh4Zd2cQBsmmbXPN826inB4/ipXgGCnsuL462WIPmg0ppgfK/g6+p7dIGGZWMyMeIZPduxXJUDlxD7mALrNxRlYYRgH926PrvpuPmwys6/t/W/29GjC4WEOHvlQnrhctlECi/NBtqU0YLWvcJB1mGfGU/kRy5YeHNjx27tx12YhZqefeK8lIzRz/1K+JsWcfbzhBde3gtPwBLfGHNpxX7kiTIwERk+rQ9/fbXNae7skvWhmZPhiICrqpL4WdhYducVlFjI9FY8CRRsbiv93Z7FSf5OuKomI7o5gRC8nTlnBgWMoJz8XpzkE790ZlclPslj7cjeL2FfaKEkyL47bEipqg3zY0Nb3Ly8dD0UIJVTFY/69hGYLiVAQ4gYnjFe7SgzOtmhjSsD07/yz0TRFaNrBmSKIboZ5IGGRAA3jbgkS3g7lwPyZFEXSXMcjp7C1jDTv0pBJu5NFfkREOUsuTAV4RrA3p1iSzMn0yAxmBU/sMj9ocbUfa8pZnOXi/jYXCAqJgMd3QcPzwpHw6IV3w0A93Ttut5AJuMEpfz74Ekq3oE/ZyJo7TzrcO9p0AMMGSuJqmapra93Ct51Q4XPhcazrhE9M3O2dgL+5CicvYpSXpm2/l4hSwNjH4HcJ4/opJGa97uRbL5b0bO0Pc+KtLYdeQLY9PadL/cCEIBHVUWTS6j7mHKwwh8t82PtbLurg4XLRt+7efo0KuCcT46u78oTDLHAzxGBML3R27fIE1MtPLCJ0VTVHu/ztbxiSG87S0IgpQ/WJwO7QMuIHSglGUiU8IUbreKoHfIOed2dWwEW43BtOlEU/o21VHHOGJd+PpwhLGgD9UsMoaChbEcl9kW04RzWANrRFnaItwLgfU00RUadplv+dRPEG3IrKaQwUrpYbA00X2EOzDtBLPZv7z17VuJXn15S8LdQnj+C8tB/8wHCdg2EyKTGMNh67NtXYYna/y4O9H58RpZ/n6jP1YrIvRs3TVrv6PtUI/LLqSKcsPbC5F0Vs/w/d6M4oI8UL5sOCRiAZFpLhS9EcVtWC2p2YHJaax81qgq20S2STLPRPnOsdHhTPrzZHJyzjvA1xwe/7cGI8U+luU9vfn+Fdpy08ncFzikQprlpFkJLIu2rPmkWETtfLI+4zXrr9SCDK3x5xswcfzD5+kW0064tTFqPF2emoHnXjhzIeH5YYokqZV/sOF8Su9PqecR0nL4UaVMyuQ1cMzSQDY37iuydMNMv5vfGY9CtzHeeiz+NqDtao8qYWR4Je1CCgYrTgKYQVIe0HwW/wgvK0mYK8vwmq3FidBmzklu+OXJEJNtD9Ewy0PDpPGx+l0"},{"id":"07c159d7-3fa1-4dca-a4ea-502f25f5b08c","repo_id":"7344f110-a8d0-446b-a0f4-7d8e507bccd2","name":"基础镜像构建","description":"kami-gateway-base-image","prompt":"详细阐述kami-gateway基础镜像的构建机制,重点解析Dockerfile.base中如何从golang:1.25-alpine镜像出发,配置中国镜像源(阿里云)、设置Asia/Shanghai时区、安装tzdata等必要系统工具,并通过RUN指令创建非root用户appuser以提升安全性。说明环境变量GO111MODULE=on和GOPROXY=https://goproxy.cn,direct如何加速Go模块下载。深入分析build-base-image.sh脚本如何调用docker build命令构建镜像,并通过--tag生成本地标签kami-gateway-base:latest及版本化标签。解释脚本中如何根据DOCKER_REGISTRY环境变量决定是否推送至私有仓库git.oceanpay.cc/danial,并展示构建完成后镜像大小的输出逻辑。结合实际代码片段说明多阶段配置与安全加固的最佳实践。","parent_id":"bed2c9b4-de63-4b03-8187-d62744475754","progress_status":"completed","dependent_files":"kami-gateway/Dockerfile.base,kami-gateway/build-base-image.sh","gmt_create":"2025-11-09T23:07:52.901422+08:00","gmt_modified":"2025-11-09T23:11:27.965007+08:00","raw_data":"WikiEncrypted:rEAPRMs+W78U3NolG1cAjoraUD6awSCIzxelIgskRdc7QCSaUDDeVcymrIahhy3dCAttLX3mc433jwlyvYeX+ZkvGriiz6WsHD2sqZaAVqVXpJ9g07A0Pahb3Cbn7IJo8/BSTbArMK18RT5B9pjSo88/bd80tucTkSawTDIhMRv88Ykl+xjLFSJn+aY9Nid2hS9FiJPpK7JzSlsH9n1FHji4QA4dh5bugncK8qIj4xVhBwWdN/1+KRj/eHYdPF4puXO/nv7pkgALSH8DicuNMmr5BaHsHLUWbPhJ0qxZf4EsnyEjZXO7qNyHC2Hvpe3QWgI+cx7oblVBiT1ro7v1kI3hitQA/XdPkaN1kn3tRhwt5kBJmmHk1W9EwisvS4oo6edRk8lSTwNj/nzgLAX9sKuqsdNZrwI6ewnwnIMleFFiD5k+WCB7zAqgZko6cdo6rKZzE6EdJtf46M/1NonX2yrarl9z9bBTLgdgyW7Fd32bmU880xMwVthP8bLqvAIB57ZmwFMYflf0Jf00jUnNR3ixqoj+CHdCBeUwNgGJtb2luWuu3QaPYt8OYkc7PZnPUav65R+PmqmSf6o37xW7TeiMHJSsGoowZwVDFF4j/MZ9jDBak3tajTwlWoF4MWskOdoIusP7jpp0h6vo8/xWxp3YCmBYWtAnDT5edw4EkC0qfv6zkPn6iREKfVEsA+UojMj8RJmj/+UgdhE7FPl6Xxm+C6/jn2BIoBUJv2jeRWcapqwK375fktEQOtjccAx0MzOzN2zbxirAoqg/l2MecanPUdDP1sRgITh8TwVAsxRRCFw4CGzYeElqItr2MkeRYVcC9S+92M6X1gdjHA0tzGbFEYB+rulrMXpDCR8/kuhbnt8USfyEw3G3eF2+PxH9B/tZcHcJGxmZc0yf2lGSOqGZGKRM1i/xVfiKQS1EANIQp3+nt+EofdQ2r4jiVKWrK11+/z2eVSsnaBA8JFTKimLZ1OoTl987Kg4WaLXDYUTrCyl1GwROlr6nf9A4bL4e34INo4YaJ1Bgj0mjtt6kyi/Bt9Xg6wAfov5GaM3DyH+Ryes/eDl0T/AOy7ER3pk669rwcDbmgCikSrE3wY4AV/upSpDKf2lwX3A/NtkngLigZ8l3GmG9HeMxgVAOnv+XatZH8hdWERAmbUxrbebEKqZuLtW6kb+0SqgngGmVlIKvjFIoiN11acTd9kt2Z91xx1VS+SszkksICSLrYIXvRqmVkAt9uHJAeozOdzo+UHWvsJaoZBqhJq9iTKse/ivxn1a3QhWxdlgVU9BQLrdBa7Sf54hj6jDbayAkNWPFzerL2XH7bQhzmcvrVTjxK3ZfcgJIuB/cLclePfXhVlB+ETvdcGi2Yu/F3BgZHKSHpVHcy3Ul1HGAw+hrjt5a0hpdFKl+fxWSei/sIia0Im70/hwDPzkkgcTAAOwtt082GRadnnWtYt8ioxRUNwlxOkUs0vOk3M8IV1LerNMQmEzPGHiAu46lsirQHak32R5GM2wW2cjSYanahK2XbnadMHAfFiJE7gBRKUiU5Goy0XEFiPIWbf+q7+StDP5O7cZiGCROT+s5rs17cmXb4YLgd7tCA9/JtCwek/PQGd7nL7wNVUlwBD7BqIjGbRWBgbB2Ezo=","layer_level":1},{"id":"6160423e-0318-494a-afdf-c9f71305913d","repo_id":"7344f110-a8d0-446b-a0f4-7d8e507bccd2","name":"功能特性","description":"kami-spider-features","prompt":"创建关于kami-spider-monorepo模块功能特性的全面内容,重点阐述其作为Python爬虫专用基础镜像的核心价值。详细说明该镜像如何集成Python 3.13运行时、UV包管理器以及预装Chromium浏览器的Playwright自动化框架,支持复杂动态页面抓取。解释镜像中配置的清华源加速机制和自定义证书支持,提升国内网络环境下依赖安装效率。描述非root用户(appuser)的安全运行策略及其对生产环境的积极影响。结合实际应用场景,展示该镜像在处理JavaScript渲染、反爬绕过、高并发请求等方面的优势。提供与其他通用Python镜像的对比分析,突出其专为爬虫优化的设计理念。","parent_id":"3e5a6a0d-ff7f-445f-9d0a-2fe8bf1feb37","progress_status":"completed","dependent_files":"kami-spider-monorepo/Dockerfile.base,kami-spider-monorepo/README.md","gmt_create":"2025-11-09T23:07:53.823899+08:00","gmt_modified":"2025-11-09T23:13:38.929392+08:00","raw_data":"WikiEncrypted:ASPW4qx/mEg7V7YbLjHCJWkJHOqX/lcen1IAor6p/Eyr2r/UZFv0JkPz0JCSgDS5ZpbZ0BEqfhFgxyPhba6yw4yG8/DPR7XSoopfan2gDE3meZoIL4y/Wc+sPWQ8/1kMSaLfOT5nCejS1+ChvQ7wmvJjveLzs40wXGIe0A+UCGsZ/cMcCbEyLLZPcaWy9W13rj062YqDMcaKllEiWPbHHI6J9BA3M1SIms/JAOju4tZT1TdNq3Jal5TrYX23UBtYLskxGDuppnwFWrO4/yMD/mO73+KyPd3rJnT3cCAu3oiDNq82LHKHNZoR9LsHmg4JuWFHp0iUm3ffoe23wWRgAPnjI8Iz5Du9Uh5wPmTRl7vNiw3M5WlqArZB5HxfIfd/bgWnZ/h87AUzK+9mgSqOXI0hSW/QR/VqAJ3fXKvwOWsvygBG2Y2JdMZaWlEKkNfsMfLHkwvgEPHj3Tso1xZICO8TYJvbjBD99ogpUYS6zPBeZ8ay/l2NLxlTW6d27hJQlbaXIhe9dEvVOx2/8OLoSigQ7A7kWkoJ7fN8g+Gb8tuLYD/Sln897mNzCOqUyfsGrbqM1FIQ5u+J+7kIEkIFUAaqMGBp+TYIvEyU9u57FMFxcTRnpXs7itmCfkXjs517A7uskpIOBDaBMe0LjsjDIbz4Gl+GX4+ASIuS7Ix7gH1bnvXZDkjBeAtOFNKkafCuNe+JTHcilP5X2YFtip5A+UhzLfAyvXBZE9YBA6lh4ezV0tgDInfnOMZTz9Lb5TlxbdZLYmQ2iDXLTCBhVaLkiounzPCHAbPCJOPvjNEj6B8EO+8qzhp7Ct9JOE0wfT26E0QzHs0jKw6IB82BlJCkRb3Ble/wv0TmBT+HonhL4IoP/u5qIKEzeb+h+bKyvtXxcZteBUjZArcydLhH3TmmYjzz21ZXzSeK8Ma0bbnAUGLj7FG6UTTuOzIM/eGPk9nijiJhTt+sRoPIvy9gQ7E10IBLPO7KeE7EqBbahjPH6kArgpRsp4XzxunCkxbjfC/Jd+2T5V5rD/eTSvL+mlLCZhGVAM/PIA/jq1N3Z1aPzKXOc62cQQSvbsLFyVlbxWtkMa3pMHpJm8Brm6b4l3XY4Z8FsGdaaGPMQdMFaDk1XsL99dhFeKtg2ACaF9IZP0EX17z3WdNslzTS3uujtRAdrUGGCyhviOS9zXMA2CNk5pBs5k/yQ1cZ7EpLTnEg3YmYS2LcfiyggpeNPx10MtGqWxvkMfy3hl/wvmKB7PKOX0F+Ot5EjK1nRZ57op3udv+7TZ+dxgAIwKdqj+7TIOC7aVExF4mdx4IcWZ+YpbQhhOWQWbcaS0z13KmuP0hjy9wmKqYltwitm65QRBAqXYCNI7NIryacuGQD2OknOdKbwOmnj2qlp3SZxP3H4oC0pzCy","layer_level":1},{"id":"78097928-b28e-4f2f-9fef-370b9329d92a","repo_id":"7344f110-a8d0-446b-a0f4-7d8e507bccd2","name":"alpine-base 模块","description":"alpine-base-module","prompt":"创建关于alpine-base模块的综合性内容,重点介绍其作为通用Alpine基础镜像的核心作用。解释该模块如何为上层镜像提供轻量、安全、网络优化的Linux运行时环境。详细阐述其架构设计:基于alpine:latest的分层继承机制、中国镜像源(阿里云)配置、Asia/Shanghai时区设置、非root用户appuser(UID 1001)创建以及自定义证书集成。说明预装工具集(curl、wget、git、bash等)对开发效率的提升作用。结合Dockerfile.base中的具体指令和build-base-image.sh脚本逻辑,展示镜像构建流程。为初学者提供本地构建与推送的完整示例(包括环境变量DOCKER_REGISTRY的使用),并演示在应用Dockerfile中如何正确使用该基础镜像(FROM、COPY --chown、USER指令)。为高级用户提供性能优化建议,如镜像缓存策略、安全加固实践和CI/CD集成方案。引用实际镜像标签alpine-base:latest,说明其在微服务架构中的基础支撑地位。","parent_id":"03f420dc-94ba-4438-939d-b3cbb95856eb","progress_status":"completed","dependent_files":"alpine-base/README.md,alpine-base/Dockerfile.base,alpine-base/build-base-image.sh","gmt_create":"2025-11-09T23:07:56.008576+08:00","gmt_modified":"2025-11-09T23:11:54.505487+08:00","raw_data":"WikiEncrypted:PUwbnKv+OblcItyhVdInwlSBDDVBKSI92baM7SJ9HBnHTqB3kWLd1aBN4kZ0blEixVWt0Rg9Ovzq08tOOpHaInm5xMD7NOC492BL44IwRLBRbWO/vwkeqEhMRXHLUzysYm7sB7Oe7MvxloFQdM2eLAP7mJz6dgVmkgKOsjwTFAqysiPC7ghcmD92QFbC1Czai+2doCCbIUkF1tXloNo5ZVQPJxpLeOXhciOZhHYaQk833VrCTiND4JrJNxZ3E67lngzoD0/ZsKczw+sm7aK+FZmf0Uu0kqxfrb4vkK2M/C0In976+NDLo0Uq8R75uUzs+BChA9dZYgSalv3h4swpQI0kdAct5onxKr/OTwdKzwPxxSL7Psg/TxEb5I+jShQ9DtslqnPsbdZWu8LeW7QW2Q4Na7vJzSq4K5tgWLYmtlivlA0Zb5PPTZJ0cbOMz3suwc6+fV6WyWCJBfpeyS9FVLfxajCFlrcgj+0x+NYyuLMUnnHNvJbIx08QUyYZypIqlGMPeQ74DzqvQDhBv500CqoRvUXzkcsgxDDy/gZ0zS8HrfYI0D0NrpNzMAMcQgGCdvq7k+POQg5gPHvxCHlrGI6nWBKL/7+O/P+IYPygNGBRRyR6Y4hBXsbbyqDL/s5t1lIHFBpCrPJs5wQLsG7MPeRw9z+qNsOkG3kw/tVf40YGo6MjeqdSvwQBKh5WvTo7JQfmHrCnUSqs66yItAXmx+OZwXBxU7Cc0Ay44QfaW1kdQJAyv6QXInOlOLhaa6TLt/Ia8E259O+EQQrFhDjhyxjnbW0J4T//yQdYljwiXg8KvJRe8j4IAj0VyXuHubK9592ZMo+DJTEgC1AjgQuCIXQQYhEZ+wRhsqHI5nALI5YABIpivhYh6F2TQWUwWUZ0fAcAAKgA8bkrbWokxLcGyI3etyXoEH8+8Wqj0K2PYcreZ7QcszH6tK2TbWss7JEezk7iKfXTeeWPelv2V7KcduoKZ/Y2dNHXBNAGCeSQsxOxs736Ncn537rja+eGNfqqRj14hA/NErPLt7I/tmrUbQSi5bTsY0rvPqyKobK5zYgB23U24V32rrsr91PFgqfjh+88jeo/7UuwjXixiGWx3vFF9SK0+cn6ybhz9QfCef0/YOlhTDuKOrh8GVKPpaCe24A4jF3LGi6AwdPdPeO4221ZuMiV+V6RdEqS8GkFk+fHwFraZChH5aaVQXneaDSiBTcRC8ye2bLu58jvoi69rv4jgee0PyJ0l9Gr2xr2CmmoFVzmfFYSJGYvwYar6vj7RH71snf89BSQJEJrcnYGRlU56uOYjAH/EAELjdog0Pc1Ha0TAJl83VJo0nPL6QfLjCKtV3MlNXKwspTS4S8zL0INLW6LGjbLqrQezowlVt0G8lqog7Epx/4c+ZtIAYnTswUe0yzKdqQ2KDL5JTYILVyr5ysCgoJJ82xcWmvYsnfLUnq/2zwYITeChecaKxqCErAkaTuklryTjoWFKA6tSbzDOUlDeWGx2JNgAemC6JRGINxyvfHxgHISXHAksqdjOJHcSIj25MUxFe5Y5Aa3g7RuDdGIuN0biJIdibPTSMO/Gzu7FUk9v7kS9Guz8Fv68Ybp/haJO03uYbfnQkwOhtH4YKRcIrBULcMekfW/U3xQ/xaqaimB/d03E6UPQwhM6lurdgURgEizvk2IDF2xhS8MRlluz1fTKi7ST5g8sdrE+kDp8hWcwJdDbpnHPPJBgzRBwL6d1ezDfeuGLVNUexb1IPtBhH82+o9wa7qQNjHhaIdw3HWP/tznnmcrBGxPwLbdZffXjP1jZ6wutCJlBpJIiM1NJypGFgfaBl2aW0anw4spVB4845xxjc/bkWs/xxi+CmtCEuSj3pletwymUe6zgi33rhfuFeCK9tgGP7g=","layer_level":1},{"id":"f53cebe0-d1f4-4508-a612-12121007a602","repo_id":"7344f110-a8d0-446b-a0f4-7d8e507bccd2","name":"基础镜像构建","description":"kami-gateway-base-image","prompt":"详细说明kami-gateway模块中Dockerfile.base的构建逻辑,重点描述如何基于alpine-base创建轻量级Go 1.25编译环境。解释多阶段构建策略如何分离构建依赖与运行时环境,显著减小最终镜像体积。涵盖goproxy.cn代理配置机制及其在中国网络环境下对依赖下载速度的优化效果。说明build-base-image.sh脚本如何通过DOCKER_REGISTRY和VERSION环境变量实现动态镜像标签生成与私有仓库推送。提供完整的构建命令示例,并解析输出日志中的关键信息,如镜像ID、大小变化等。结合非root用户(appuser)的安全配置,阐述容器运行时权限最小化原则的实际应用。为初学者提供本地测试流程指导,为高级用户展示如何扩展Dockerfile以集成自定义工具链。","parent_id":"3cd6b111-cd55-4414-9a4b-23c4ecdd4953","progress_status":"completed","dependent_files":"kami-gateway/Dockerfile.base,kami-gateway/build-base-image.sh","gmt_create":"2025-11-09T23:08:21.22698+08:00","gmt_modified":"2025-11-09T23:17:28.961825+08:00","raw_data":"WikiEncrypted:rEAPRMs+W78U3NolG1cAjoraUD6awSCIzxelIgskRdc7QCSaUDDeVcymrIahhy3dCAttLX3mc433jwlyvYeX+ZkvGriiz6WsHD2sqZaAVqVXpJ9g07A0Pahb3Cbn7IJo8/BSTbArMK18RT5B9pjSo88/bd80tucTkSawTDIhMRv88Ykl+xjLFSJn+aY9Nid2hS9FiJPpK7JzSlsH9n1FHmRhI39tXrTj0BQDr1uBjr/g+FGva/FKhZToTllXnoSrYhbTBN41UxF9YtIZnAkE86pilx3XIpFTbpXQO++TSkvB0A7F7oiQT0OMF1zcWUiFxtablAHJcdqwHS6h/YIOYlXPtqvIgbZV/ZTyYZxvqEeB8hg5v5YfmEdoPeXPfD3+qqBP2zbT21QmbNzWYqaNhAFJw9MEbToDiOZ4LL0a8h6b+FnWXsuk1/HWFs9aoCUbb7wxIh4bER8YoD+1o6lVHObxCHwUIR3/8EN8CHmEQkgBv/IzqQvXMkEQMEFGXgd3HM3mjgbPFcwjHku7/O2uTPV5hM+af7I89NuZnx6EZbJr9Ktw9P3AI1dlHUj9DhywUe0+S3gG0EPmLGNQr/xWQN57FAF56CMAqJeK4dNPRMZCx8XWqANVU14f8tUoOCRvDqsEk7hSGwSJedg7tPqpHqx+gLjg6G8TJCkONAoeA2OV8Rc34TKy1y+44uQx4Q/0+jKWVJNplWijigAXmr7pbYh/r0oNj+u3viY6j2SielapR5cfPawczxGEq2LidGpmKp5mnJW8xR3/6hpHQBicUlHqIX2lF4jx/WiHAs2+QlS0p/vK5B7nM2LbQWrE1GEG3WXArzEH+cq+DfcIVOvAq4pbcauP9OhGf1L1NHb5NHUukVPYkmbOGGp5zFLMjy4RErYNV1vc0zyl8iuRe9R9sJHT/KL/3VCg6rFscba8/xM8W07yS5pX6BkP4dlz11DVTiFSms8xpAX64e1jxzvc4hixOweT6cIowlSsCyH6n5E+855oG4uQJ1h7CbljDXZQKQsM6oOLeXFPU7GURtsL8Q9Vitzd5ZuOwqTVhIgoT6N+bi9Ki9Fgc4o8Imk6NdvIgOSN9j4CZc71tLs7JmXmqQ5vRb2HtMwrgTpe0ldEgUAisoSswgDkZ7dcFfICJVE5tR194RB1He2mYDeMYaJLkyv4pK0EH/SngW8p4H2g+5micl2KELjvTTBoW6mMPU5TK3iTsS4fs+6YL++g73s9MCcO9dvYEGg2si5+9ZMuS8NdLoMGtLwMLyOF3LSQ6fGR5NEfY30y/0GHKQeUMV0HCUJgK8uukwpvYGcr0MXsm5/qdSJgJm11ciLw8uC/zWrXE6XVbTggr/WiFrD42JU8qzmsr5WihIuGirnBmWH9/cUfJQimX9f+LWPIS1TczqddoV7++rbQKOqVi1+Csi13T4co3+pSdDu41InmafFEs6VS+uBN+NYloiVIcaPvY0DQKFn+P1kTLF5+Hoqe0YmPCNVduVOGbq3bcKuCHJzIx10wXhTT3oyMpzg295telW4DMhZLxLqA6wg1/PgoZB976dGxdWkvD0SK91QhMdn0uZ0=","layer_level":2},{"id":"87858ac0-b4c3-45d6-b46e-5b9aa92027dc","repo_id":"7344f110-a8d0-446b-a0f4-7d8e507bccd2","name":"快速开始","description":"getting-started","prompt":"编写一份面向新手的快速入门指南,指导用户如何在本地环境中构建和使用本项目提供的基础镜像。详细说明执行构建脚本(./build-base-image.sh)的步骤,包括如何进入各模块目录并运行构建命令。解释关键环境变量(如DOCKER_REGISTRY、USE_PROXY、VERSION)的作用及设置方法,并提供具体示例:如不带参数构建、使用代理构建、推送到私有镜像仓库等场景。结合alpine-base、kami-gateway和kami-spider-monorepo的实际用例,展示构建成功后的镜像标签(如alpine-base:latest、kami-gateway-base:latest)。提供在应用Dockerfile中使用这些基础镜像的代码示例(FROM指令),并强调非root用户运行(USER appuser)的最佳实践。涵盖构建过程中可能遇到的常见问题,如网络超时、权限错误,并提供解决方案。确保内容简洁明了,使开发者能够在5分钟内完成首次构建并理解基本工作流。","order":1,"progress_status":"completed","dependent_files":"alpine-base/build-base-image.sh,kami-gateway/build-base-image.sh,kami-spider-monorepo/build-base-image.sh","gmt_create":"2025-11-09T23:07:27.827352+08:00","gmt_modified":"2025-11-09T23:09:18.775219+08:00","raw_data":"WikiEncrypted:qfgbutC7oyxR6nMxrwk1ODnNMBEQ3/sG78fQT1yXWju83LC7H/jAM8CEAvWT8huE5OClmQiIfNYNxHQ9s7RRSz3BPo0TFNlVbmInM5lzUSEEf+YI5BGx2KGN3d+G0LQiikAd/kU5aIxOEOguyg/vW8SkM+fOFCqFOxf8LCU3g7rZYUFF2aPDGO5G55zdtkToqcphhDSRmS1nMpftopCL2t5+g0kKGcliYFzvMdsLTTdKtQbSd+z4ihO59L9IIbI3dEyyPXPXZcU+FsJIGHD0GVErBITS9+r1yNARs9u8Qt6m6nyfIo9WAIpfQjqawIJAwFIt8x5pr8Cnk8eeJ+TDI48ARvDFhZz0404/Qi5Es5iwEV0gEUvmtOqeSZ5jQs6Ts67BcKsQWD09KRy6hR2Rzkf5tnxKnKZ/oNt9Z4vZKDNi9HHxEKDw3TB7voZuErlgm9DWx0Jd4kdsPTKsBpk3ebLD0Wlhebn9yGxGYNgnb6J1Nl7tKRnBOC97m00LIqKnH6530m6yoJ/xci6RGgWsahBWr0W2+9nt1GViilFsu7agurVWNgGyS7xM8xzY0nUTBA8QpTkilP0vqG2/46Osk2zjP98ZI5uxTEfnhCJI5oOnJybG3zyPOgquRfWZs9rhAysdajd/gZOdtx46cU5daVqkEnpXoR96fv9pkxG6VTp41XTD8HFts/nV8K7hL703SEVpXW2B3YIm7Q8ixmA4khLDxf/ogYEmK4WLloCmRzbLTbIsTpxcY8SmEZG0OiRPkxHPErLOPmoM33h0oiXepG4b4hmc73a0OLga7MZ169yGLzLzVhNuXP5ddq55KEzfJjyk5te9C6rALx4xGOc51ESjTWX+8GOoV4U53a9GfMkDfbes6ksHT1t6eCMzS3WIcSk5Txv597YeOhFpxIzsjOTXvZC1Mm05NkRnVPxMvNEodgjb9Pl9cWleHXLrQsUR1ssXP4Trd7rwMtHg+GgCyn9Ft4RqKBoGm5apag3TSuWWbMnV6yqFV66HyFw9WIH+iHJHJV3nS1/gM9SUCfRZETYlgbPqdmtrBThbzZyViB7Jp64MOZyrn4knf6XEcQkANnpvWSOhGANoiQylfSZ/i9W+xB5ZsJZUHJ1mzV8hru49s9MDZ+4+9T04Pd41JM9FnNY2Ce1tq518im/AiBB1WVheYjGa3kzR7urmMpXvkY1LpLyQ5x7E+hilp3VWB6IbAyQwwurKT6QnTJTe8SAjOQJLFBmZrduNMnL9GfTC2sou08khrs4AJu8BYgHGZeb21CIYKw+5MMcuquaTrW42DOKL4+E57khQE99OO32pedD1+vZ2QM6yAySIXZMjCUsd5XtVE42vdeCfI3upRyfmyc2EAwKabgiXJCI/JjXPSv0E813kXqWU4jjPRksSnTGra0DJmgP6OJa7HB5fuA2oFXkGlEw19ez8H99mAsGBSyVtFJJmp9bWQuGYkjyuQn00kVg0BIfSn6q7GA9MkelNpD0mmZYtdY+d1UCKI7kmIaQiC5cN7AHEUS4FFrE2067o6bKN/S4ztEDpSwHKhI+BpsS+jSo/2riPV+lt42QZhMiczrNAHzlMiQZKl2ftPwXoT4sz/5IAlOJ+hfsNrK/GBlkMxg32F1Vnbqgfz4zadBXejUTXHeq7tZ0Fct/kcBUUYuRublrSb/tdQ0VwUdcTje/qdkHcVWH3ZlqzCHVyljSObHji1q7kBk+uIBgI2Tv5Wwl3lBrOAY+8IQRFN5N+PxdbScvkr7HDKPo/U34UvApKanzHN466s9BKgTey/WnV"},{"id":"c24099c1-6bfb-40ce-9315-6fbc1e8741d7","repo_id":"7344f110-a8d0-446b-a0f4-7d8e507bccd2","name":"Go依赖管理","description":"kami-gateway-go-dependency","prompt":"深入解析kami-gateway模块的Go依赖管理体系。基于go.mod文件内容,说明项目如何声明核心依赖如beego/v2、sonic、opentelemetry等,并分析间接依赖的管理方式。重点描述Dockerfile.base中COPY go.mod go.sum ./与RUN go mod download \u0026\u0026 go mod verify指令的作用:如何利用Docker构建缓存提前下载并验证所有模块,从而显著提升后续应用构建效率。解释预下载依赖在CI/CD中的价值,避免每次构建重复拉取。结合go.mod中的toolchain声明(go1.24.6)说明版本一致性保障机制,并提供依赖更新与安全审计的最佳实践建议。","parent_id":"bed2c9b4-de63-4b03-8187-d62744475754","order":1,"progress_status":"completed","dependent_files":"kami-gateway/go.mod,kami-gateway/Dockerfile.base","gmt_create":"2025-11-09T23:07:52.902882+08:00","gmt_modified":"2025-11-09T23:13:09.422393+08:00","raw_data":"WikiEncrypted:rEAPRMs+W78U3NolG1cAjnBWn8/DtoCGBoLIySQVnVINWOZuIxGmvr+YbeDwplhKzp1AVCWLiNFA6raPhrZohrNjRtvrkFPbd7Y0tTmn8XeDR5hOzGXMHWUVJl1QDhoZ55dDbnO7EtqlCtgTHDsNvnGwC0zDcP649C0Bcu+SVYZ6Uwo2ysQE99QBJLHazgyTs2H1qNJRwOt16or/r5bGGAGHjO3kvKuhO4s/ME3NBEtCwWj3sQkbx1aCeA3rrbtTdxR1U9zteSPjfaKChkAzEyHjseUB56E919Y2qPplNy711BDYitFstUVtlWT2nJdYgGv8EefpRfr8QAVLdA5o2J2fUyLFhGtARwKUxLiQ9+cgTrhQCnZhTW+cJheZUnycxLxuC1b03fmcB8oktjkBwRpbNOWmhxbPZoumsoS4Cxp96BaE3Zd8YoiV12cXUd/rEIaR5azftrNe1gBr3mstcqGKB6v4bWU5DbxaLABBxuUX+TFe1ZPVD+xX1gvKTkNpIZJuS8LsUEbnOaobtvh++4xqwF2QMg1LofetQ4dNrnqCOJ0GKgryR3ISKK3AJATdF8iosjiMxL5R9ZTSlajttzh/R7Ik+m+ByjT/D6CJ++sOrP/muC+y1RLeC9HR2BEhpyezl3aaKkHDiR2jKHsUuNuOnCSeiykogut3kuDZ+ItLYyOj1bC1mZScJwE76GOQg7iDac3wB6yC2gq7rpW5RBGmgpHr7kMOmhisVNE1qJZ7kV5wfxxuxoLbh8a6QVj+J2OKnd4/qfbGwPnGaOCFT2Z9R04SuYLsxh31QRZ8PidxjQXneliQcwEVKTaqIUBRWb6WRGIxeTUcpjHOVYF+a+9d7NNvTPPym8jXzFpwj7JyVVpjK+mmB5CtUAFSUf8GmCHMchPCV1YZZ2KlpHMpkkaNVk6clFJ9t+8WqrQRipY3ysx8LfF9U0NSwyXGEUxwSFYuf6pyzF1nRamn+5TOf8rBGlmPzGeWec7ba951izbtIuLQ1EIWWuX6I2dbvUBnMhCYMkyxk5k09tyMj5C1yjBA4miMWRjo+HBlW/i5jfQ4vVV3zPU5mlp5HA8OEtndNf+9ai04z/NRPnSMfgoRZ4128+FgJ9hblDNBXw9hcnnJ8mafavlV+m1OGBlJRwHdOzTsKXO0e5IQK3EWWEn639hmE5X9itzVRsg9yQAj58Ivst+Gyp7jkCdzQVMeILMd33bp4fRXtXefVBfRGImhyfdzRsgA8eGgmSq0VzZt0fSY+pgbDhYzV0GbIfsQSPJksijUMokhAFyjpj0GqU5BkVU9z6nmsSlabj82m5aBJegmTwcuWwfijXUg9CeKcTkzp9nkGGx9DUVB+F8o1USS7Q==","layer_level":1},{"id":"2fd9ad61-bf0f-4453-b139-5c069562d31d","repo_id":"7344f110-a8d0-446b-a0f4-7d8e507bccd2","name":"构建与使用","description":"kami-spider-build-usage","prompt":"开发详细的构建与使用指南,指导开发者如何本地构建和部署kami-spider-base镜像。逐步说明执行./build-base-image.sh脚本的前置条件、推荐环境及常见问题排查方法。详细解释脚本内部逻辑:如何读取DOCKER_REGISTRY、VERSION、USE_PROXY等环境变量,动态生成Docker构建参数。演示如何将构建后的镜像推送到私有Registry(如git.oceanpay.cc/danial),并提供完整的命令示例。说明如何在实际爬虫项目的Dockerfile中通过FROM指令引用此基础镜像,实现快速环境搭建。包含成功构建后的输出解析,特别是镜像大小信息的解读。","parent_id":"3e5a6a0d-ff7f-445f-9d0a-2fe8bf1feb37","order":1,"progress_status":"completed","dependent_files":"kami-spider-monorepo/build-base-image.sh,kami-spider-monorepo/Dockerfile.base","gmt_create":"2025-11-09T23:07:53.825039+08:00","gmt_modified":"2025-11-09T23:12:40.584346+08:00","raw_data":"WikiEncrypted:ASPW4qx/mEg7V7YbLjHCJaase6SWJf8POEQo+2KlK7RLQfu4SUoBzx3LBQ3guv4YfBxmo+GbJwYhf90f9DoHdoYnO8lBLiai4JEfBL5iQleF4HRXvJ/6zEEKTLOxylsK3g6WmMleSYAtnxfYBuNjdOAAusq91qDeqN5fwtqqN7JUsHCWB7/yMLBlRc1bOZhB99s2i71b9gaWBevRVZIUyPo9VoriY6uLobBkxLACgO3YbezF1Obq56cImdx+Pqm9CFxen17tWQvWtHMZ8Y6D/QhRUuGgzJuwJPE/lsyfRt7JPErweR5/SL3Cx1Q/lFln7ecL22DgFRkia5EkFjop5PYmtAJcOawTpXNAao9CcOwDGx3hldtf2ER+c4rgtKCNW57yeann+sct02PwZmrV+3litWE8o/Gvy1oRLTEfRRV9fGNeVQONvOuxD1/aYlXx5clvsArjjhkC+M2VcpXFlyF1wRbO77GeekjHfsJs/39sK9+ImLAxmoiIXZ+sP9qWYZUEgqb4Y/pW0v/i3mx3qr+W5tyoB76m52zlylSoYnO752uNbpxcdsxZINqQ7XZH9NU4WJ4YFLi8k9Fo37a1BChwKmGYUrVLSizm2vBYMHdZJy3SUzOYdLPRFU2IVMesHcT3NqbsHNJRlkaJ0M5ZBJPUUAsgUpj7ZfejTGLhbnvoDSn4TQ26OtfIlPiNxYkK2MA27zhgw+d7Sj8gp0TyD/WFKTN72T6/Nmv9iqcDoscvAreelp7HoGp4wvyPlVri8bvadAkzEJkm6bZePKH9IlP6zROzfkdQWhKi3kTsVwqSy0tVqIze+bgpQ5J/J7jutb7rXlmDzyfQz9c7My5Z5laXxtV0h8aMW7TgZUYYK6wdaP5rjim24Z6sjVhGFyUWs6+AxwRYNcPRN754GJKm4Z9pVulu5HKSiKGLxFvFtgQhxM/6W7AkZDn+elY7lvJxcyZ9Dp9f72WpN6VbXVQwdaFPPOu9xqpxejfsd9KZlr9DYXlGP1qvz1h8KW6IVGKr6Ox0TvER/Jda3ZLhp/qXwooeDGQv6zlJZn7JjFz/YnE0Nod/sgywQxgIshxFyzDFX+FDTr8PHL9TQLB7ci86c+cMncdyXVAksRbbZdru9gGiNacTi2iGcikCP2L7KmC4xYlUCLdIebhDXU+gfqt7ztuLl6u1UTlKHf09f06FK0M0fAvuMrp7ZxwM4wABh3XT799AECuWKjAG0qrWeKjDgLUNQF096F0zNuWrg4mWgzxY10B1TU//nRnOYCzIjAwT9N5p2pVAtt5Z6Er9QhVXCyGqdgkkgz2oQ1RDkJH9NCWHnI38RHNN1Cv6i5fu+YB1q3quES5TvNyoKz94VCAeV8q4GQKpaPVkw8000VDOAvM=","layer_level":1},{"id":"3cd6b111-cd55-4414-9a4b-23c4ecdd4953","repo_id":"7344f110-a8d0-446b-a0f4-7d8e507bccd2","name":"kami-gateway 模块","description":"kami-gateway-module","prompt":"开发关于kami-gateway模块的详细内容,重点描述其作为Go语言网关服务基础镜像的实现细节。深入解析Dockerfile.base如何基于alpine-base构建Go 1.25编译环境,包括goproxy.cn代理配置、go mod依赖预下载机制及其对构建速度的显著提升(10-30秒应用构建)。说明build-base-image.sh脚本如何通过环境变量(DOCKER_REGISTRY、VERSION)控制镜像标签与推送流程。结合go.mod文件,阐述依赖管理的最佳实践。详细介绍Dockerfile.improved中多阶段构建策略如何优化最终镜像体积。提供从源码到镜像的完整构建流程示例,包括基础镜像构建和应用镜像构建两个阶段。解释非root用户运行的安全机制和环境变量配置方式。针对高级用户,说明其与Drone CI的集成逻辑,包括变更检测、条件构建和资源优化策略。使用kami-gateway-base:latest标签作为核心示例,展示其在API网关微服务中的实际应用价值。","parent_id":"03f420dc-94ba-4438-939d-b3cbb95856eb","order":1,"progress_status":"completed","dependent_files":"kami-gateway/README.md,kami-gateway/Dockerfile.base,kami-gateway/build-base-image.sh,kami-gateway/go.mod","gmt_create":"2025-11-09T23:07:56.010266+08:00","gmt_modified":"2025-11-09T23:14:06.580157+08:00","raw_data":"WikiEncrypted:rEAPRMs+W78U3NolG1cAjsS3+J3juI6CT146KDRQuHCEzadbEbF+X9BWt2fiLZ4lKABFILeTWU3jK6x1YwItLgstJDP0TC1lMvIDX3dO+JHaH3zI/JVstgmQE99utx5SrRwQ/Jc4z7w7N8/QQmTQcRez/2ZkSyw7HrBacme73Fx+/avbyXnyToy5bF7K9FpPRp16KAVovDjWR5K5moMu5EbgfGSW4ZC+Kxdko/gqgjXTxCNU5DuhS3ENScsVTKXo3gsK/ZF8QTSVdp/bgTG/lQnzm25dP16f/e8CwWgkGSmXIvDzaoBDwprIRPxbZYk9Q52uqW1iXE8SBrc7Hdg/a7IH5DNKBU2Rg/+H6MOt7bCWLI3gUjs2rLHb4cBFVIDJ8bCG+JQftDYFUuvHm6PcpRXix/uP+XpfI+IDJelJ8a3M26JwOcOgad8FWaPeFDmdw3Zuj1rkisx//9XPQe71e4hnFhKOOe1hAEMkJed0c17wtAZ3RNrJl/xXvpf/J8NFKTFupr9xWxA7dERBEAQPL96Npc4tknL9h8ETt9MVPgbAvLRf5tShqOnGMQAeLel4/BHSvofAAfzUiTOMZj3ODhDcTN2AQsH6PBb9qzmBDh+gBMSyWQ8VOunZmAmL03Zl81ZWqTvaBL3wNwAV5cDuZBOKKDORnFspuciyRfTwignDWQ1j5YywwedSbYJWHjBuoEZAODxE6/9GOAgZmubGN51FnhAr3mRAOUxWy7XLTQ2+ezlB5hl7a7r7t3ACVnOx8AtFEgJn3bNOatL11UggYa1n0saXr6sXY6tbbCUFEwB00ZTIwGSmQpnh1fIp/PJBCqr6l1xVXyxDRVV+NPee1nWla6DykHJrnbkHTKXebSFsL738wR0k3m89/NbHr1+jSzJGx0w7XgTm0dxyaPelO68PQXbZZPGbB8/isfEsFvEcufvN6EEGpsCPvTiiR1+zfEvjjZEUpzn6V5+VBCxM0/EsFfxRg8hs2kuwyKPX0pHANd3Kb0xb+F7gszrofEEYdKMK7C4tu7qOwJuydqTVlZ5rM6hFS+w0b6Em12Ad+fYtJB2FWaA6kqu73/eKUhlrRauaXvKsgpTEZTaj15+y9o3SoNN7SfOmhwpX/YXmfyPCb+TFxjxE0ilc6pwRQXvBwSverBrp/rRLm8Of+wfDHg1sZ699g2isyQNlQNrBpWvkQCvUGP/DTkq5PGy0i4ti2yamrJifkXteOfkNTs+tgc7Gb7XCff0TrCKaM9cv/xj+w1Zkk9EXbXMvNb5/2+/Tmz6YhozfWP0jd0THRvUgL2Uo3aScMPfxAiaBtYQWhQ45tzym+peNzv5aSLHlZUwAAZLd5h36cQHMFwXLK1HIib/ssiAdKMH/k8i328jLzeGTkjGxKhRx9VXSBuHPanz3DnDDlfRU2fWZGAB7FabHhyczINS8xaWjpdBp9lrYZjDh1Cnp7uu12cSu/DOIXCYy5NtMAqH1z18vPtr4j5kxjqEjDKauQGT3WHlsWpBuRk/Hi5C1zZLoh6aEyttMkFC5HCcg+goHehdTfqP09EjpC/uW7mpuIvSwGi53u4dDKxXN4RxFgJFwM39zjF719BuaitsTRq/NiVm78TDNrd1G2PzCxRaeG86Li8K6cGLOHlsebeGRd2zIX6Q621TdBRzIhijzwVDcZdqrVoBBrCGnniYHJeF/8FONcY1XXcKu/xXvSB4I1hpyFqEh49kiUL0zxfbi9W8d04t5h/LOghKf8q89J/rfdkrWDkhw3RT/EJSTf+XFGOa9fgD7rB/A8MAKZsi8CTB+bbngnZ5NQMrSx/2G7Ygip8LyJ3ems9Z0PFKxhSwCc2uSs13cH97LpxRL4VkRw9WGJoPkVBtECl8JqYfa6QGZuplUCgvZhj1QB9k=","layer_level":1},{"id":"d989e9db-0336-45b5-bb9a-08c65211d8cb","repo_id":"7344f110-a8d0-446b-a0f4-7d8e507bccd2","name":"Go依赖管理","description":"kami-gateway-dependency-management","prompt":"深入解析kami-gateway模块的Go模块依赖管理体系,基于go.mod和go.sum文件说明依赖版本锁定机制与可重现构建的重要性。阐述在Docker构建过程中预下载依赖(go mod download)如何消除构建时的网络不确定性并大幅提升CI/CD效率(实现10-30秒快速构建)。对比直接在运行时下载依赖的模式,分析预下载方案在稳定性、安全性和性能方面的优势。提供常见问题解决方案,如依赖冲突处理、私有模块拉取配置(GOPRIVATE)、校验和不匹配错误应对策略。结合OpenTelemetry、beego、sonic等实际依赖项,说明其在API网关场景下的作用。指导开发者如何安全地升级依赖版本并验证兼容性。","parent_id":"3cd6b111-cd55-4414-9a4b-23c4ecdd4953","order":1,"progress_status":"completed","dependent_files":"kami-gateway/go.mod,kami-gateway/go.sum","gmt_create":"2025-11-09T23:08:21.228192+08:00","gmt_modified":"2025-11-09T23:17:52.274958+08:00","raw_data":"WikiEncrypted:rEAPRMs+W78U3NolG1cAjmvwKXP9N+vDp5uxJqbjq6g/zQJ3dm35cJra8sza+QSzCOjcM4kgwQe83rG6SuQVkQwozFwxwYlU/QzPePb+brTLZWiKO81fwBPUekjHHBZtbIsAlR/plv1BQaM6ROSCZQzSTCzC2MJC+zkIrM5yunxMM81oT+sNcWijOxAgtwpC1bOod9l/zdzTJVn3+9vHnW4RvUQ1jMUNF4yS5qfI28ngg22RzwPxjEDCMdve9rT9RNofBGjI6h1v2y5wt3M5ZbENNhz17T9vGzWXItLx4oS9GyCoZA+3D4w6xeKIhBek8mbMpnxPk153fmVeRSDm8aX/vMlN+qv2CjS6bXY1Y6wMB95P9q12/XjVwaXuVoQqlmw6PtguZ8vkvDBYNOV5oiwfqUYA9M+uvqBLrFjpiROREqpqXFBiBk8Z1nNeG1RJMhTlTefbSEs+rxzI0bhJXvP9LBC3SmhRfz8p2IpwrYkV2lz74QaYqMNud0m9ug7L1z/jknxh5e1bO66OCFMUOO8ANUcsZ5T7ydVc4IbVBaA+fdlKF2sVGfXszXc1loyhSuh81oUjWwiMCaxA7fj46jWgYi6qPeiCPIl3cxyBe7yuaL508Sfh9tyMOnfp/ecbvOW17p6KYBycQ5ko25yNoRzBWYO9QXUeH+f6rM0Fzbv+bLpt29vjyCz2cStl4m6dH1xzFvIT4zJGpuJivjPZN7qtCUxW4ldG5X5iOckgNvErUMskjO4oi1XNdQpnXruH//2JCBd4vG55DsVVlYy+dEDCN/PTsAGqSOVbyo6VX/H7OXS0F0pCrz93FLTMeaBhxP/gMFqRGXTFyKIp3nEbyQ1MoHbzc5TRq/y3pxOscXcEJN4v4WfaDw4BKCtBslOFzwyqVR1QhAy4DWXTngVCZ55OP5pUG4z2PWqO2CrFyNsQdvrXSN8DIDRJUBFW8rTsTErJq9Cd7Nuwk1LEqJxrBp6Z4B8DvoX6nPK9P9rsgbn/9WSmm2VRud/J84X74xaGKsWI2ysYAxT96Q4leEykFlGl0tmXCogWJZiVRjQNr+Mq0RFANQ8HRHNBGDtpUkiOnIgV1deMdGiAJoi4QskeBGbRgvgOX/I9ZPtXERNMEKPvPlZO6+hcDyq2lrEuLJIBmts+6kjoF78M06L2E/aCGycjEJcdw5rG8y8Isy23rTIMS7jJZcw1UdwHqpbPjBwRp++uIqitN+MOWwdJa9q7die/kjcID1PLJZO4icZr44LH1mOjM7aPMcukXCeMbYd136bf+SnUshCAzQPwQ6E8xw5x8YiuBXtZoUPIXSyP6oEtprfIjebufzVxW1+DS924yjxM4Bo2KpTGSH1vg9fRVvBvLD6IDSU2h0yCYvJfcwqSOEBDJzG1kNXAag4XAcN0qCrKq0jKyIo3C/+JzORhKwgr9Re7z8O6Yec7959kSITs8RKqsWSbu6WvanJ2HfgoiSnvyeP4gzJw+eaCX2vAPQ==","layer_level":2},{"id":"7e3ebf37-1574-48e6-91fd-c38325ba1c0d","repo_id":"7344f110-a8d0-446b-a0f4-7d8e507bccd2","name":"alpine-base 模块","description":"alpine-base-module","prompt":"深入开发alpine-base模块的详细技术文档,全面解析其作为通用Alpine基础镜像的实现细节。详细说明Dockerfile.base中的每一层构建指令:从基于alpine:latest开始,配置阿里云镜像源以加速apk包下载,设置Asia/Shanghai时区,安装curl、wget、git等预装工具,以及ca-certificates和自定义证书的集成方式。解释build-base-image.sh脚本如何读取环境变量(DOCKER_REGISTRY、VERSION)并调用docker build命令完成镜像构建、打标和推送。重点描述非root用户appuser(UID:1001)的创建过程及其安全意义,以及/app目录的权限设置。提供镜像大小优化策略分析(~50MB),并展示如何在其他Dockerfile中正确使用该镜像(COPY --chown=appuser:appuser, USER appuser)。结合实际代码片段说明构建流程,并列举常见配置场景,如自定义版本号、私有仓库推送等,确保文档对初级和高级用户均有实用价值。","order":2,"progress_status":"completed","dependent_files":"alpine-base/Dockerfile.base,alpine-base/build-base-image.sh,alpine-base/README.md","gmt_create":"2025-11-09T23:07:27.82828+08:00","gmt_modified":"2025-11-09T23:09:00.385053+08:00","raw_data":"WikiEncrypted:PUwbnKv+OblcItyhVdInwlSBDDVBKSI92baM7SJ9HBnHTqB3kWLd1aBN4kZ0blEixVWt0Rg9Ovzq08tOOpHaInm5xMD7NOC492BL44IwRLC7mSBio7Ib3VFrIXzX3iGSogaE5QSRv+u+5dJM8DTOEZSXi4RD1w8b0zQJnvQJkjXywgmEoK4xtqG59IcRMq9qjHHTbP7V423pINE/98O7VRuu+OzCkelf4swGvZonauegSpCCN3LMAFZcTD5EqSIgw0sqTDM6tBql3ev7ilfsUw8ClTm/l1s1fUA8Q6q56bcaAwzt9MQfHo+C9/sSkiOrGgYrUXQp3g/MghLY6XwqakC18oiDsMoh988pOWOF3RziXcnE00ZjgFbRJA4uYINsyUiaflaIptABx0tB29jkzprhJZNXCkVmkQV04l2vWHgrV7USmboZSQyxL+cp9cAKce8gKSl0Nk9MULzXqvPTnotCcE3r/MwlTq7MI8oNny6RwtVb5LpL0lzxrw4f05fCwYrgajplkQ7aofgot5q1ibbTtdrSGDvVfBqMOD2Y0EijE1RAMniBbZqkCxP60k6ugkHHsKqwqC+X/M7y2YrIrWFMMxD+2AvOCZ1jOmtiN4+5IeYXmueAbnhWgqHVuIfIxVO4orlgGfgcjMyUhYg9+4iiUsNmGJ66rF+wOoaXTergVc+4qY253yRhTtkVzcwpnBL3YHKqIn13NgsoJLJX9Ck4JNlT3nhY/gMJBNPZHdQjoOpeIdSnt6lXceTDo9Be6jhp1FOdedG8w/uRdtfwVL8MJZqyDv0OqbAztzRvIlHj0x0mADulx+xlXkx5CLKsdG8EROyJZCrsr8+hC1sC8xeq8Uhe0UcNfZdZuUB5MdfzJ73l4FfISOlh0Y/FecdPWWrb0tVEz5JVO56bd14CrVfIbiW73HYPgaAWanmMkTcPQRZKlBM+f5JLvW2WzBybvdOpwvJpyznL5nIAldxfm8fK55t2iBt8gtO3bYJsujXtHj7M8MULaxauyDbOu6jhUtX7gbh/x1pRx8gp8vjUodzvJfnxWtmyzieJFmNflEeVwe+CkiBzXdlAv2CkoTzSLZVZQNSowszaQNKRgnhCw+cxzFzsUQQo2ltr8K1+L207PpRovnHmc1Pt32EVfr4By5RwkZr4u4Nbgv8VhHxCwguNBgvmfcrN1fvEu1sjS3CXeCzMqsX9j05bg+yPDWklA+P/t6f1s0l3eg8+YVYS8SIhybzBqk5vBpPmAMP0+BcHNA20LxTkhX/XCG6Eq2bWLDTqoDkz2ceh46KnwdIr0saTXoMUgrCEn7XBX7e6gsfU5x8c/E+xGAH6eP5d5+R7iEMPmaWCS0QfNmQDIOQUoQm8oqgw9ch6sFUJjv5GnOqFnhrmQDjfwpMf1sQZdf08c71b22ff0fGQwLROZ4FrhSFkMH5rSH3pkNiQ27oLrHwuSepWLdaSdYzPxsIEu6SrO6+kWbeQQlT4dff7PDPbByAHQ1ZXVmMOt5YTd5CsHkBVQXwTnz2FvJMBybzCOFLQWXcGJi3Q+q9PqjegDxrZVWlKkVzKwmyiPpD9Ap6DIFl8MOg7upVgh8C2pYGNMPf70jin1fg5GoIwuNROXjgxKxA9zuXbT4HKrsZzvpAA7/2rNWJNaW/R4RX1iJaxdvGQtZ6IV/FfnO4PDqJ8tcdrVlxgGZRvVUmr9cu8/LJJzWRNU+KprFv8kBlzfZHrbDwEYyXveCqg/jokdEaLpo6PyLWKEBjrTmAubXgY+WvCZt2+LI5JRoOcDehSgs7aD8OcWO4HzteXquSexvfMoo5PUNhGOa/7AShqKeufrKErvQM="},{"id":"645a2e40-6ce6-4b5d-967b-5ccc8e45f41c","repo_id":"7344f110-a8d0-446b-a0f4-7d8e507bccd2","name":"改进型应用镜像","description":"kami-gateway-improved-image","prompt":"全面介绍Dockerfile.improved的设计理念与实现细节,说明其如何基于已构建的kami-gateway-base镜像实现极速应用打包。解析该Dockerfile如何复用基础镜像中预下载的Go依赖和编译环境,仅需COPY应用源码并执行go build即可生成二进制文件,从而将构建时间压缩至10-30秒。阐述多阶段构建策略在减小最终镜像体积方面的优势,以及如何配置非root用户运行保障生产环境安全。提供Dockerfile.improved的典型结构示例,包括FROM kami-gateway-base:latest的引用、构建参数传递、环境变量设置及最终运行时配置。","parent_id":"bed2c9b4-de63-4b03-8187-d62744475754","order":2,"progress_status":"completed","dependent_files":"kami-gateway/Dockerfile.improved,kami-gateway/README.md","gmt_create":"2025-11-09T23:07:52.904207+08:00","gmt_modified":"2025-11-09T23:14:28.645855+08:00","raw_data":"WikiEncrypted:rEAPRMs+W78U3NolG1cAjrpDCCzu6hEemNrCSY9eebTEwPj/TEfOtdg1AP7qTRQXY0joVS/jf1l7pTBjIOU0oH/k8FzKEsN2tPJ68W3ubgf7rirsKODPkCZVrj/KjMpdJKFTBYW2VLbOOoJhp/cD3J25Wlu9E1MF5d7dCg5w+/bVHgE0dfreZqb/OTpB1ZUQwjs9xm/Bx74OM8K1gtGbukTjUsLS53l+WaDZIghJtIxC8xy4sDD1y92El5su+8n2otiJF2Lmb4wnCHeHxnhZ1aKd44qhuuCgalARhSH70XAzl696EfMbYlgh7I4Ki/Hk1dihrHuBmdK2oLrL41FEBPORb/MT7uwXqQTjgFQpZNJorBg3k5xu64c8QK5BkkB/iJRBuX6BCuP9cI54kQqXM5Z4TrOZEFo0lBpEx38VnMYZfmZkz6i1KxWyak3QjEbqwNtPaARlJea5H87nbEtomIph0ngq7Ox0mLt7o0s5+1nP/MIaf5fxZpFhx9chaIIGSVc1bLJ1sEd7J1NE2M9H5mzPct/B6kIFov0S6I++pZ6qF4cFx5dc0im90IUNRzcAQvteXo8/72HJuAr44cgV0bmGQ8kHc+/nZULKb+iQUsfUdwkh36Q+ZPEYMIUVIE3su5/TwV9urt5kWyZtIG/3byaWu9+hfPVUroa9C7jkohiJPRrxEJkvrUxqyV1cm1FjyF3Us549bAoQ/H8SvYQW556Cx7hAXZza9sE+KrO1lpLGaS3WkGcqF1sgp9afnxAzWJtsKZ2m4RkYVftywgukJq+aQvgvoa8lCnUz9uKRWSFQ/gk4UAcelsEX0hKRKi1LGoxKmoKZc1Yhjz054vwVPembFZWP6OTFUOrjq5J5wt82oWW52yG/bMRHcboSeENJrV6gAkrYdk99p1ufEF2TxK1lj+V1liRIR7ckk4TXHXY2KlocDgQ8eh71EhQBQs9WyQu/aQtxRj+4jcHx78hFgahtqZB7DmFs2lHeNEXPQRM78iEfxI8LgSE4ZMykT2AjQaRrKt/s6wv3ZCRNC9mDHmRHxOOu8wYNV07ShtoCstyxLXZ/tcFtXpNQOGcbAzQgVZKlo26V/Cg0wpWlU8orQvY0WBGvUogiXRp2ZPgoAYuKhcab16TsFwNawjDlmd7nIoMHEKPhrDB317ULpri9n2hgP9Y+A1i9TX6K/iVvric3ogBpLd/e8WKvI7arNFwIKVPPAmRc8deGMNIAP1h7J2vowIeIuh1DRpPPGogZm0bvorxr6ZTKn7Og+kCN3uK9LYEbOnhA0idN8sA8JNcTgJzyWKO2XwIgI/PWXjelWfIJEY1v36jjc//nkqj6PlMG6pRijsznqfvriefsORBqKIRSJWdRvhr2rb8f4dgMkYw=","layer_level":1},{"id":"269c6751-74e2-470b-aa81-73af9c865c7a","repo_id":"7344f110-a8d0-446b-a0f4-7d8e507bccd2","name":"配置选项","description":"kami-spider-configuration","prompt":"深入解析kami-spider-monorepo模块的所有可配置参数及其作用机制。重点说明USE_PROXY环境变量如何控制是否启用代理加速,以及其对pip、uv等包管理器行为的影响。解释VERSION变量在镜像标签生成中的用途,支持语义化版本管理。描述DOCKER_REGISTRY变量如何决定镜像推送目标地址。分析Dockerfile.base中关于时区(Asia/Shanghai)、语言环境(zh_CN.UTF-8)和系统依赖(如libglib-2.0-0)的静态配置项。提供配置最佳实践建议,例如在CI/CD流水线中如何安全传递Registry地址。","parent_id":"3e5a6a0d-ff7f-445f-9d0a-2fe8bf1feb37","order":2,"progress_status":"completed","dependent_files":"kami-spider-monorepo/build-base-image.sh,kami-spider-monorepo/Dockerfile.base","gmt_create":"2025-11-09T23:07:53.825754+08:00","gmt_modified":"2025-11-09T23:14:22.11288+08:00","raw_data":"WikiEncrypted:ASPW4qx/mEg7V7YbLjHCJaGXmfF7itgIHHEUTlMcz6d93ucAXvwC+kWCbz2cGGgzxR87qJ8vfzOeDf352LhHrSU3WC6s5U7PghXyVIcaeKQk9qDgYJxKV2hsAmIwGNQUHc+TfyZ9TditQ5e0C2cgEVdiX/FPs2vB1z7M4dKUHnQGd/+x5QZJt3BRzZ3XlDRpI5KUrcxDqbPbw8IEHECf+wX4srXyx8ekzTOf8LBpSUVnp8BBjvKup4VDQh2gJgcbM+AXi3SxT2NyWhziF5gZ0WLU7NDuG0x/ZF8JG0xbLLHxHs4MnnKMZ6Xb//wDnYEk82UwOiezQYXfK/mcAV7if7lgAC0yeIKkG/kTHm5b0o0SFzYZ95a2aLt2mVMXdrfHsFyQ8xjSFtdVeUeL4LocPAmn+a0SKU9kJOkF5usBnWBAKXv9VaRnXjXvPDfpNqcpKlzhA4LqD0RJPjvNGrCQkCZPryOyFmpAxs7YRW0yTCp4BmUfTIPWAGCkJOh4/BPJdlGhOUa0dutSQqjch/Lpz2bl74503Y4+FKMMA1cjq660Y4pRolXIpKShD0XqhQMJwQkX7dnLiHbdzTIro7sKjTmdvNOVuuScopxaf4POO/foC2bSEQEJGYkjwmklMl9VAG8+wmy9PzKsO9KWBMMdrVOOwZqLpjEeB3LvBHHl7qquGGlAWq4vZPhnH2KD68C1fuSCohduoEPXEZRTX7XCPuLLoue3h1vy4dDxfsZAKCZnjnhnoM6+s6kYaQf41qQT1Ki/ApqGWM2Zn7b/4PXsNk0Za0YBcyEG3t20ogCjAR7VTQzCXB+MwkOnrv3Ob2+Dovj1xk/ZrAL8jFmkKfBSpGJ6/M67edtZ+6EREjf7y0YHLLcQln7QYtJU77ZVXjSvlVIGp8byRRPhQDTz5eRX1vnuAQircHBVmg2tXmF/ktA8V3KYzeixvfxv4OyyPKpos9kYPwYjIQSRgflDfiqMangfnIfUDVEJEsyQ7cGxZlnIPwCIpg+R82OFMoCxgxLfVeVZ1b3HLfZ1MNMIdbhfG6+b3KEkFItdngcnPrjlEeqTMOv/kNCvP01ketJVe6io4tc9SSmYzRn+1CuUedJiR3Pwl1T10+17GeDl2cA21TkGNfHqneYnx6ByIKMRYSewYY4USS4SEPH9E5gvWAB0FFMB9LuK+YAWfym38a7je7DC+wLqb1/RKpvYOKZpxpZHpO4n3Sp47r9B7ACpeK1tdxd4YSzNvOxXEHRPjqXw3xyQZdm0YfnrHauNPUkHD+USqFmCOunpcf2EfKLZnjEz/Q==","layer_level":1},{"id":"339675e9-e221-4ca5-9a18-b2390a6d1aee","repo_id":"7344f110-a8d0-446b-a0f4-7d8e507bccd2","name":"kami-spider-monorepo 模块","description":"kami-spider-monorepo-module","prompt":"开发关于kami-spider-monorepo模块的详细内容,重点阐述其作为Python爬虫平台基础镜像的技术实现。详细说明Dockerfile.base如何集成Python 3.13运行时、UV包管理器以及Playwright浏览器自动化框架,特别是Chromium浏览器的预安装配置。解释pyproject.toml和uv.lock文件在依赖锁定和可重现构建中的关键作用。分析build-base-image.sh脚本如何通过USE_PROXY环境变量实现代理切换,以适应不同网络环境。展示该镜像如何预装复杂依赖(FastAPI、SQLAlchemy等)和系统级运行时库,从而极大简化爬虫应用的构建流程。提供完整的构建命令示例,包括无代理构建、代理构建和推送至私有仓库的流程。强调非root用户运行的安全实践。为高级用户提供性能调优建议,如依赖缓存策略、Playwright资源优化和大规模爬虫部署的最佳实践。使用kami-spider-base:latest标签作为核心参考,说明其在自动化数据采集场景中的核心价值。","parent_id":"03f420dc-94ba-4438-939d-b3cbb95856eb","order":2,"progress_status":"completed","dependent_files":"kami-spider-monorepo/README.md,kami-spider-monorepo/Dockerfile.base,kami-spider-monorepo/build-base-image.sh,kami-spider-monorepo/pyproject.toml,kami-spider-monorepo/uv.lock","gmt_create":"2025-11-09T23:07:56.011214+08:00","gmt_modified":"2025-11-09T23:17:32.615268+08:00","raw_data":"WikiEncrypted:ASPW4qx/mEg7V7YbLjHCJUQZ0fXgWRMMhLXdMaY+gsZshHHnfmujJA7P42ycCc6TWJv4QE5Z6sx01VJW2dQ2UH3j79idis1301Z/Vha6BQO+qqwwa9FjynQyZrxhC+2hzoJ6yQyb8PeuqHWqsybaGcXN/Ek/yewP8btgsLUHr82EaPyl3oJ3A7gz99ih3iw1brXX/HaTZinDTYqG9GKSlgYbFEoifVGtiPVuRi7llXn6Mv2A4pNXFPgM5xj3DoutZFOKP7w0J7D/giNbJdo3zvVInusL8rLx7ERlvIN9GcmbJto9cdsuR2Eejy7vw2WeNdm3LG1XESpCw4BSSRcstxSI/s46tsbyImSXHAStYj7jzrO6Y73Jtb40ior8uoXhLtYXqs+h7spUFh7Fl9YcDVQ7TrrK33zSCtvZ0jqlAizbqZcU6Ko7kVcDPOk+0UMKIEgO9/Qv3hkUZpw8BvRW+Bo0KNxa9g2jMd6ftTH2JJRPrFzXY5NsbM1IW93Xtk2HLhhMSj2MpMIdrA1baaOYZXyo0pprrIDIdTohV31M0AdhG624CotFDqV1KrVGp2e+2JYHmnP4pCsKfaLU1/Dm44A0ybnKxal5VIdo9wajDBDH4tc3rE9gzVf3EC0gMoOMAmLCiaUi643Y9hQLbFViVPlsk7hZD1QpuZNTVUnfTZk0d1eqwAXQc1oe7r0MzMbU3wxg/mD/Ud0p7HFq6mRusbsM6WGLsWg7GdDuXyVXtXVyLyqaLG9Ur5gpO1L7YyJAPYnqqeVvb/PUbiTfU5OiNhrfS6bWK/BpT5HRHkIJvjUAWc/ruoShRVFHksa0oLmI1KbUACBb1VA4xL8fTWvmUJC7IOTD6eKptzgceONd0SjN/0WUUo+4HIVeTpznFya3Yc97iNQA6XqRl+iYW8ZY6hCU/+2lLD07tDA6m08w1xoyjw8OPmepPwwZTM63hqYoq7sJzBQk83sBaft9Vgn6SGk6R1jBCuIJ7A4g8hM4qRW3W0YRLjU+SIZ8a0q9R7tXR7dHr4OtcysQVSGRTRmCmjlbgyUQfzSMEkKfDtyc/r4uM9lPva7/u3w745D+qxVqz8cQLKO0fW4I14g/r0/HU1LYLX5hMWA7S4F83UxKFZi909vCGG6vBPDK0VDHcAEkWSe2oWA4tf5fwQoPhGnTftfuFALjhFOp/GWbvGkKxxq2eRF17uE+6in6kVO7Cf1RIfaWa7ImkOli0jf5MZYiVhTVSGwRq3wF70OWJcqkZiLOtNxX8p7moxaxPolRnyYlP3LPxalXbWzOKm4cYStz9Wg08GmtcPvCPYjlNCU1lFP/uyNTQrdHdY4zuZHaW2v8yWgeCA5omW6CwIuDERxfhXctiSmWleKk2QMxY8riuHlN2zwp/mqtkxoJXraugcWdzSITfFessm3CottCma41XUS/yriS5+msE1pSgNQOT6JlgTmHZPTyElt1R/zLFERnsqpzTnGxo9yWonBvRnS+LabB2vQN8e0iMZoONksdgabeZbErA2qSd/SD8Vbdr7pC18+ISQatKy0egt8x0REblLZHcQi6mj3XzS7kZcd/NHk87zowkg/tePhlXx4xg5by0BUwi9tD6E+di/mf+uCo44wt6XGXPSPsvPX59/kyEjx/aTjVYWe1XX1fdKccQWY8iP6Db3Dh8hgwBJtytTyUBpJNbRUKf6AtEOJyOZnleutou7skelLCDh7tkC3sepKi1lRvOrMDnD0JX2scOe5tbApwC9Xvlzv7i30ygn1KYdNDXnxU22OL+UuWkm6KBLkrLnUZVZxSMdSejTfWvZRhoI6smRa6MWPGqjTD4yxva14jZLgiTwkIVTOm8unA7Ew+UZj5Cr7W6q39bsiwd8Kmg8hinfvHYP4WrhEVuvPL2HoR0R5iJ+ESoUC8cEMkLMaX4DRetMLr/jE6iMt63HiGPqVrY2ZaYKi7CzH3knYBCdveE80uLSpRxQdsZGN1KjfLozcUHbn/yLB9Qr2269lax9Fhd2vqL058B0DHCw0QVtfl8UN1xvafdJX/9dnKHxEYqLg8wCwi4cXzB+Cn7RVoARQAeR4OTGNJ/AF7CrJ3fuQ=","layer_level":1},{"id":"a26f150c-03d3-4768-9d40-9cf3981ff53a","repo_id":"7344f110-a8d0-446b-a0f4-7d8e507bccd2","name":"CI/CD集成与自动化","description":"kami-gateway-ci-cd-integration","prompt":"全面介绍kami-gateway模块与Drone CI等持续集成系统的集成方案。解析build-base-image.sh脚本中的环境变量控制逻辑(如USE_PROXY、VERSION),说明如何实现条件化构建与镜像推送。阐述变更检测机制如何避免不必要的镜像重建,提升资源利用率。展示在CI流水线中如何安全地注入DOCKER_REGISTRY凭证并执行构建任务。提供完整的.drone.yml配置示例,涵盖构建、测试、推送等阶段。讨论镜像标签策略(latest、版本号、git commit hash)的最佳实践。针对高级用户,说明如何扩展脚本以支持多平台构建(arm64/amd64)和自动化安全扫描。","parent_id":"3cd6b111-cd55-4414-9a4b-23c4ecdd4953","order":2,"progress_status":"completed","dependent_files":"kami-gateway/build-base-image.sh","gmt_create":"2025-11-09T23:08:21.229094+08:00","gmt_modified":"2025-11-09T23:18:03.5503+08:00","raw_data":"WikiEncrypted:rEAPRMs+W78U3NolG1cAjlFT18tj9EbjBLjefhM6qsb+iW3Sa6wVYn6Km45r/q1KORvzgQ2F86yi36lFzpGVbS+SlJqdyG/x48m009Zlowytr7fMA60jblqrlyFYywhxQA4/FQpouKsOsbKqNlBEwffzv7jJDf+VkCqs76C4NAwepWthCzUIkYydTxlPeh9c1EEFTaoiMAWjWT5OI1KVsNnvDUuDujzv0viUun+U5D52hJsDS8q5ddMz2GrGyLjX7WQkl+42+zUY0y+S7+TeTXfVzVtwa5+3T/V/blmNq0XZG4RMlSMkrI6XBc6YpRlYHr3Ep3FKv03c2zcldNMggIRY3k+Xtj0zR8mpqQPxkQEngkwuHgJSjvUAjgl/iV+9GJoiXYQ4F1xnlKfw4+/fAYSJpojP9fCNqa0fMpc6qQ42ipA2HQDr+FrYPliOJkyVo2+NhDut+c3kYqhNuXvVU8m1+fI2jdY3kEs4JDc2/RfnwC7uF47pLozvAJU3+jzzdAAm0HtC/gUODhomzQTk+/SLAQE4me4wsNDwfHmHaRhQELs9v9GrxO8IE2J+flYn7NbSCM9jgi+VZlgHwKlKGHBYDtSgy5RQ6PD1yM7u/baep57HoPaNlRSGr9e8RAI6FTdQGajJvlH4b+ZneX3mK2QAkK4S4iPnX4O4038HgSN4D5F8OS1Ll9VPhFGk8q6J5Yjik4LGazDnUvWfokp2IDbwxduoD5xIgMTorjzc4un/IB5aM291a6/Aw4lkXUbDvmUo/kvwA4SEjqBlf5PgwEOpPbYmnmbs7Qf79XxSGG8xl8pHFXPzC3y+S2GndiMumL5LyhwQU04dQh8U1A/WtInDYM3dEyZ92lkDSjCDjwDppKMHJP7gNorpYYhrrv9V2zI65ED2NwjrV/5SSgOyku5Hhtrhn+Kh9QNtevhbMcesFw/RgTa0rcQE9ReybFNaSD+hX+BjMOtH2+iia8RulnZ1jBe3xnYr/w41L0Ld/L0SQ5E9/qu+pxfzWmBH/ktN1ccTVt1jhFDMkuMewiYBTSVLc/mIBJwmf+26AB4f+w/zVaLkRJkGR6Zc8sa5fW+c6ojMW3IHbBxBqT3dj/scj83qwiNbvVc65zYEFC5Q4XMBF5m9W9oD20UTXn0hifT0QH9/qkZUz0fIieieqKmpU9D1bLN/YbVnS9GYsdpNjHrHCzZQJkoA21vXGIaAukruqo0fvVydrIZEnQYYM+uNKRs1y1+f3DRE3mw1Abxsg8hNFy6PJ/PUDWR4ea00ii5LXbY/fGhpu8wxMEtxTyZkoAi0XT5TmRDRd8TPSFJUAO1ynKUwvuYlTi5x6hyikW0IiKqfL58hL9GSFsZpss5GvtlyADc0qxjexeMRMIa2J9Z/idG2Gcc0tO/ZZBmSIhf+","layer_level":2},{"id":"bed2c9b4-de63-4b03-8187-d62744475754","repo_id":"7344f110-a8d0-446b-a0f4-7d8e507bccd2","name":"kami-gateway 模块","description":"kami-gateway-module","prompt":"为kami-gateway模块创建详尽的技术文档,重点阐述其作为Go语言网关服务基础镜像的设计与实现。详细解析Dockerfile.base中如何基于Alpine构建Go 1.25编译环境,配置goproxy.cn代理以加速模块下载,并预下载go.mod中声明的依赖(如beego、sonic、opentelemetry)。说明build-base-image.sh脚本如何实现基础镜像的构建与标记(kami-gateway-base:latest),以及如何通过环境变量控制构建行为。介绍Dockerfile.improved的用途——如何基于预构建基础镜像快速编译和打包应用,实现10-30秒的极速构建。强调非root用户运行和多阶段构建带来的安全性与镜像体积优化。提供go.mod依赖管理的最佳实践,并结合Drone CI的自动化构建流程说明CI/CD集成方式。通过实际代码示例展示从构建基础镜像到生成最终应用镜像的完整流程,帮助开发者理解其在微服务架构中的高效应用。","order":3,"progress_status":"completed","dependent_files":"kami-gateway/Dockerfile.base,kami-gateway/build-base-image.sh,kami-gateway/go.mod,kami-gateway/README.md","gmt_create":"2025-11-09T23:07:27.829032+08:00","gmt_modified":"2025-11-09T23:10:33.893344+08:00","raw_data":"WikiEncrypted:rEAPRMs+W78U3NolG1cAjsS3+J3juI6CT146KDRQuHCEzadbEbF+X9BWt2fiLZ4lKABFILeTWU3jK6x1YwItLgstJDP0TC1lMvIDX3dO+JEm0B4FbTu1TCZe98yl2kvxOEVE8pPh36mGXc0kagPdjYimvqDQtjX4u8bFv4T9yOxYAYw11uGjIHSNcuobk+TPwkzEIoRuz9arU0gpdQN49YEuxL4IKTzdmeROdV0ZsgthBhPuL1l6hqJWx+2arVhnT8CSqse9axZfVpeD0ktZLcJqZCRlKOYk+CdfAG1mhmJsy5wotjtgYDD7typKSxsTZorNHkOILo334Zc9bcsaUiDE8MJa7+Cq1jCQZqxMExWVErBKDK2HqSlsrAqTcLvuV+tWksOwCPkexN6OHV74ET6AWrjhbWfSNxRJPhIlme0DNMUTI0+zqHmbK7t+QIKQDJdF5YJbGa6CSp1v8wcZt8vIO4Y2ploo7xmxpG7Xlueyy6zywC4SQhpzhBnSQzT+TFacfNF/UviUCYFtj8DW7tQlDkWapz7rhUb+q4eMQq7RmDkQ4H/jCvJIDaQWxfGtFwAcY81XTh/lOb8+7VQLflnyAkXEsVBW3lplouxcnUw9NFie1rYP0fZTh9Ye03Vz/2S7syFZCv4mnhev27DrHllI+QfrjV2bihJfe7hr0lOx7VeT6bDryeElMkQlcIQ93ZJNYpzCHCmTEr30mY9CFRFaFw6omOjK9B841jSorOexdZusrV9mSHFeFK85KykaVQwYT8Ue6WkQOoOXiMnjuujyOIjyVFfcUB5loY0Hf/I14xcXvD+IrcRtdc47+pfS9JHRw22IuPsVU7kiKzMOjqxZ3LrSTre5MOV6e/WRD5+Ggp7Jh8TuWU6aqeKaFhxpPv89Y1tIYPOfuoMPH+FF+LIB9PzqiAfI58oHhxvxrafV+mPa0kDCErfUuiNkYiLjERfzsoImlzGxFNBEDQnOaMyiWct4zYLEy770EBWT5i1eBHR2thcC72da+3sVG+w426HTt+PClm39kEkSyfBy6mvmLyS24j2eQEuWcglIM/DSw+z5r84DAE+h00/xy7/mrGtNbmdajWnqSLnBnI2oMgAPcrNzgKCkclGtoWZuAZ3HZXOZGoZl6GIM5OjviTtETrjOkYH0QYORdz270LhnxuUYiamS/ehoN8IEiZ4hf115t1FcQEz0QMtre1R2d1+CLXtNr+XiY7L3cEn0kXdeVpzCl2f5TQ6sxnlQYDrEJaOhK+H70d1GlmtTX9U02U8KX3tNARix2pX63AQZunUiGZCf4myrPGt4I3iBGVpdMt48nSML85hTbdMh1jVO7KDyepEbj9MwwmWuHGCWpjtjpAu/Xiy4PkjAtRZf+99pzYn7YRUwKQMOoMI4uYacXNK6PuXViK4a/QY6NJAa65+uQK+Jp+2+qzckdKRKk5iWQtf8HCUC048br07gH2WLQNE+4xKNqgBrefi/7d2NmkQwqDJ0MQxz2L1kTIIG2l+n+OeCmjZTRjFeuXT6Ar6cq7HZT3GRTna9wpP+t3Ha+2Uj/YIGdvJpwBYslZ8UNd+RwVFS0ZLwNa+TLkcpL9hGBl1EEahIR5ujX1aQprdpvsalvf46G7jmf3LvqlNXD67tBK0EZuylCniy7awEzEYz6CqgbTeDVDJHIxx0j56iELhcUCXaO95y9dU2BlRa72+dRJEvZq7jOKFIT6T5XmOwzKLGk1vhAOsvJ9BuUeYRbGkAzr3TF37yU7ZpXW3I6GZ0Gs2+/u7I6fJNTGHI2DF2uMoQktF2CyUkuhu2NmD7qeWxD485+xGqeQBzxev1KqZHqmILxwoFBH7ht91CiUkQxQcwnUraLEwjPBECLWatinh3Dc7m+8W3SITQbUwezGGTKAI="},{"id":"c99b73ed-5093-4cbf-a45d-b1eee990f2d2","repo_id":"7344f110-a8d0-446b-a0f4-7d8e507bccd2","name":"CI/CD集成","description":"kami-gateway-cicd-integration","prompt":"系统性地文档化kami-gateway模块在Drone CI环境下的自动化构建与发布流程。说明CI配置如何监听kami-gateway目录变更,触发build-base-image.sh脚本执行。详细描述环境变量DOCKER_REGISTRY和VERSION在CI流水线中的注入方式及其对镜像标签生成与推送目标的影响。解释脚本中条件推送逻辑(if [ \"$REGISTRY\" != \"localhost:5000\" ])如何避免本地测试时的无效推送。结合README.md中的CI/CD说明,提供完整的流水线配置示例,涵盖构建、标记、推送、通知等阶段,并强调自动化带来的效率提升与一致性保障。","parent_id":"bed2c9b4-de63-4b03-8187-d62744475754","order":3,"progress_status":"completed","dependent_files":"kami-gateway/build-base-image.sh,kami-gateway/README.md","gmt_create":"2025-11-09T23:07:52.905268+08:00","gmt_modified":"2025-11-09T23:15:18.136633+08:00","raw_data":"WikiEncrypted:rEAPRMs+W78U3NolG1cAjiVMh0W37ivm45D45BQDVab7UZtV6uy/z1pHARP0KrVWz+6XRjjtKSauLXyzNKdYSdx2neeeAnnYoc9OWSc0HByEMsT/dAkSxFwPQE5LCUiMyBVLGnLedW2avTMELteY5VqOspAzh8YppWquc0S3mmgqoNRBhbmC2QYIVFtH+eihvi1IU2iUoNlj8/jrytbRIEwYhsk1Py3CtCNQyAzu5r4bV9Y0UCm92qi6Cu5r+FlDs+jqPH0RYApN8JQIAErn2B2dBYhoADlSeVQBKngyByD1mBIpQxtR5qw2paoLEyDLf+yH3hIsIVICgu98H79eMdIJoewVELrnhxe5PInlsjD6D5TmA/VJN5NUsDfvXipAyqgdf/VTOBBg08mZ9VfqTOZ0wGUB+hihC2DDq/iAHKOPn/s5fKuG9DcCSyRx+wtiR4T1scQlFQ4/h8sjJMKK+tc7VDNbsotzy+JrYXV8KGuwPKAJE/CO3vrqNW3WTK9CyJ6EouKuTG35tzircXOIsUloFc4LvkGKcD9N30Ip7gZ5UWat5CJ17m14sdcZAftL6ZPjkWaKRr4RovrtXutcP4reOTZ57NpwoGEgWexLQljWGfy1QY6DAoMfhmICwIRPIf68EP4NBUYpsN9246ntFyTZvd7I9AZEqovLqFTHbwOIyhEQREC9FLQ7R4DEGLhIftlJajA0ArN6tNeiAlZYXhurBlw1XfqMWOB3zUvDBfcfNYF1RtKyS0XrX9i7yj7zyKjPvFSimUzipMpL/0u7W2azgG+T36njjLKlXTmbQFkfIaSY+1ZDFjLuGLft8npl17CEmHEG46q5gl1WTWyDoKdJgbz4xeNfmgdnig/1dU9WbNOeeMCKyxvKA1Hb+k/KphoU0bV1VuY6J70giIOWl+PSfxwcxD/6X3DFTSb3wFyd5K971nh/j0vMXwOjAUKk713Uj2SkXvvp4ocPcA7a/fSupHL8Yt2waskzhpo8E6j5jf5JEv/kcK17o9SeH5IZtAhLMIevWez81eI0tNI06ebbLjWm8FKjdC5sK6sXcOG6hcEMw4TgF3FNuE+ZB6Xu5PKvmfxf1XeCQe3TLC3DQpSFHOk4a0lBva41UbXViWwFvuiI5MapK1QGaIZVml3MhIOdIRJOSwVTXMCgTYr6CO/WnvBAlrdl2Cfa66qhzwnu8e+keCojLJx54eitRFWt9jmAuctPQf/jG0lcCiSH2U+G0nlgLXgpGgRzw0oJWmIZ2hucxEixlPpT3SbhpF7IWJ0Zw7+2MYVcaoQ/TAm/N+vgjDrWd43Qhc6USG34/u3B1PTUFaNokOwy667K1IHsgFX5ffDNnZyklnNUi51gIb0PGyzLShTd5om4nsKvZYg=","layer_level":1},{"id":"b88f3e9c-a57b-40bc-a946-71407634e380","repo_id":"7344f110-a8d0-446b-a0f4-7d8e507bccd2","name":"依赖管理","description":"kami-spider-dependency-management","prompt":"创建关于依赖管理的深度技术文档,详细说明pyproject.toml和uv.lock文件在确定性依赖安装中的协同工作机制。解释为何选择uv作为包管理器替代pip,并展示其在安装FastAPI、SQLAlchemy、Playwright等复杂依赖时的速度优势。描述Docker构建过程中如何利用uv.lock锁定版本,确保环境一致性。分析Dockerfile.base中依赖安装阶段的优化策略,如分层缓存、依赖合并安装等。提供更新Python依赖的标准流程:修改pyproject.toml后重新生成uv.lock,并验证新镜像功能完整性。","parent_id":"3e5a6a0d-ff7f-445f-9d0a-2fe8bf1feb37","order":3,"progress_status":"completed","dependent_files":"kami-spider-monorepo/pyproject.toml,kami-spider-monorepo/uv.lock,kami-spider-monorepo/Dockerfile.base","gmt_create":"2025-11-09T23:07:53.826603+08:00","gmt_modified":"2025-11-09T23:17:09.554336+08:00","raw_data":"WikiEncrypted:ASPW4qx/mEg7V7YbLjHCJW4yexvTwPheebh81+Xv3pjBkKEHQ+NoXTZo2Sw/KPBHvoP1AXYwN5gxdEKGyBjg9tGHTj1cCgruT9WMH1lx5NLS6cVImWICmE5pVI7mEV1argdKheSeWne6Wg145SO3uSEQgFpbD1MTDCYDG9Kq4Q/S0RFdwnfysdxN+8uhozCVFHSkbMcp4agZaHl5cyH7H/cLBsIAC6fAjSaYWQ+1le/Hgu55+IadG9Mc2XesSQaPo/nQ5uElY7tHId6dYz9qoJ8j0+4ek8S2IvnuJzXjVXLOo9Zh+/Q4IQ7g6y6Xb5mRjhJCZZdxH7w6ReLiO9RPsQ4H2YdfM+1k4BuFrPR6aKwNOa8Ddh5bHnoVTunt2mqNBG5eH8Yr6w5BbkKQypxXmpsya7AOliFPZhahQgatazc25wDOw41bMVJJNKI2A/mEwKTlP/9hprjEkx6qBFQ85iBOvsNY0LdLnBrjQkd7GosUuVH8V9DjrKtjo9lNpPQ5ncVM32Gi3iAOLj3dMZp+buW/4tiCMsFTrNC9vW40rQgQHK1B0hAug65M7NhEZIJi0e0RzYuZ2HSlV5l8p0aD96hYmETNs8v7cPsLiBNpSVhqV+fisH7Wp55Pk5kebXwiLy3MhcH+o6Pb7rPavyVubncRcveMkqWUSoKaAzuhNMbY1bFYN8pCYr1c3H0v29MUKXZ/EPhKqbQLH79CgGsRA0cQLRzMgiXn+P6Esw++ZUD2RKMVycdb/n2xkxL2H1N0dZcMzR4hdDztgXyKFbGjZbpQ3YgjhT/P/j5bYBuUXCIPyZYw/pXi0x/GqP3Ftc8xUJg/pnuG8CNWhYXothcrLc6rmG1xmJNTyAPPPtw7kspeHc1r0q4Dj6niz47eZaNmEo9x9M8gMSg7gKC4s+z3hNb1W1RR6weM066E3ldfSz7TV5bEUTY41h54YJqwx3bROLPZL476q67DPDu1rKXPI844w42Nwn3fsmhDhlswtGZ8uTAaTzpBWESsqhjbsnY7/gOJ8FSatxVPHfNmR93XJRGGhENeTBbjq84OK3FtvsqRJfmvzgtdNkM0724pSjW4/FfbkXILKRU3mf07OgaJXKBrrloPA3Qoh7IBhOX9uWGniuQfHVp+8crVvc2ATySe26j5j6oBoRaJBh+RWgpATwhU9ComEnwsp6S19xGtOX2BI4S5xgFrU3izXSf/zYPbLISgVqDiprvRX76IFxqJc+RJhbX2VPEjQELanAGL0OK+UsP3OkQnsCNUJaw7iDl18NshiFro+lomF1UF8mdrd+gKSj1whHL0Qy7L13hmx27c9qzNCFvGz+BULKKf9jaTjBJy8+KttxzF0RA0Y6K4PQ==","layer_level":1},{"id":"807c5414-dbc5-4fb4-98d1-34245f938219","repo_id":"7344f110-a8d0-446b-a0f4-7d8e507bccd2","name":"应用镜像构建指南","description":"kami-gateway-application-image","prompt":"提供从kami-gateway基础镜像到实际API网关服务镜像的完整构建指南。演示如何在应用项目的Dockerfile中使用FROM git.oceanpay.cc/danial/kami-gateway-base:latest进行继承。说明如何在应用构建阶段复用预置的Go环境与依赖缓存,实现极速构建。展示多阶段Docker构建的最佳实践:第一阶段使用kami-gateway-base编译二进制文件,第二阶段基于精简镜像(如distroless)打包运行时。指导如何配置健康检查、启动命令、环境变量注入等运行时参数。提供完整的Dockerfile示例,并解释每一层的优化目的。强调镜像安全扫描、漏洞检测和非root运行的端到端实践。","parent_id":"3cd6b111-cd55-4414-9a4b-23c4ecdd4953","order":3,"progress_status":"completed","dependent_files":"kami-gateway/Dockerfile.base,kami-gateway/build-base-image.sh","gmt_create":"2025-11-09T23:08:21.229659+08:00","gmt_modified":"2025-11-09T23:18:39.246634+08:00","raw_data":"WikiEncrypted:rEAPRMs+W78U3NolG1cAjpUG9zVReLON6+B7Chmkmnjc1S238+QeZKMCaGz6Gs3OFHTS2rX3okiKjUgYBu0BiC2m9QXfw37xW1YPB3d4/hJePp9dY4DLtoOmngCTqhLMjYWqebnp2kkdLkItEBN+vJSAJRZ27kB35bgIuDN4QuGnaxDStlw6C3bNPTG2bL4ztwY6hu0dxW71gU8VshKYE6lsxm0Jq84RGJZJxVvsuYScCsQW/R6iCoWcBG2qvl5LlmQxXCNIJkqJVgkiDQQF/NqkClvkmuHiUMtK2K90t9AKfIbNjHJG3QGCwzOOPGw6qk4trS1jwJrybd9+nMnB4Z7CK7E7sGWYuZg5JY0ASGeql60yyH1s/mZ4lQCKz94DKqW87ew9FkrhotX/PHFpIQAIqqRYIeOrtbNZiL9oRp8gaE6Dj3h91XLlUZLvah4473gTWk76L1f6M41TlQql1ExUgvr5eseRe4Fz7o4Rbw8rchNjAndwfwG+aSd8DfALFt7nP9C7gmvymhuWde2IqPhjXSQFtnu0bKM9BZDi/MO2yWJODIITyL/voojPSpZsWBbuIzMyRUpkF96VdbMWx258IGvOyP5qolgE1g/jHV7J3pEJa6Lr9JUGNWf0d1xVRifBMH/ArVThaIJW7u4twsRXhjFdh8qf+a63d+/TmpoRbtU2GJWUPnXHJa7xbpxTTCt9TQh3ihAe/OwsdDh4m4v6cVOb0hrBh3MuC90uKGp5HBC7rzHMj9OTeLBnHmsGWso0LiQWYUpEFBRR2Aad5PXAGh/2QH/4MCEr9MpmijXNbXhIWd6UbmXwCV0OVNDvAgViC2ajmSYYTaJPoOsmiG3kq4HGgF7l2xGMQYTX+eteqZfqfmqBNXH8kCJw/nD2mVjLGTB07r2T1pJyx2q76xfdHZfSBY0dk8B/cdwPhootmzOWajrlpLQxewEVuzkvD99gsjUPMmcYnHvuNdLhFM4NNpfGlJI2OcpB+nwlgPRfn2VL8FrrycOL+vkzw1EVaZwrUfVoPFbtHdDAbezvicACUpSqPvroth7/3Vu0lcHcFi+Pn0GKqTx8AnUb0OjV3epRF2LEGeaqQyPp+C49eDCA5aJD2MAw9YHUVlcgD1Q+QDlYFdkJlwOA5h43hKdqWYAAvBJaPQ2C6pfX+WldsO59eQZFZtF5WOeM/boHCcZjyO+YADV4cft45jbTJRp4EB8uSQT+fYoPmfdUtBUgmxcqjSz7ImUTz0vhK1NUqWwrxZaNF0ThxE8IOB5J4jvph0UTTjlmHmZNYvzzKPZyL9Vfy7Vn8ju5RIcCiCg3WWxGFm/7mla2NlsJYxUwEMJgrDAUnG6j9uAN/kYpN9fKeB9jtk2qmej6T/WKU5zxSLrKvtK22q/n6crEHTdvZvZIMuOo02XkHdAYx3A0e2XShVcjUUF5uxKOOHUBJ76VOp0caV61JcJhestyxjHqQ9FN","layer_level":2},{"id":"3e5a6a0d-ff7f-445f-9d0a-2fe8bf1feb37","repo_id":"7344f110-a8d0-446b-a0f4-7d8e507bccd2","name":"kami-spider-monorepo 模块","description":"kami-spider-module","prompt":"为kami-spider-monorepo模块开发深度技术文档,全面覆盖其作为Python爬虫平台基础镜像的关键特性。详细说明Dockerfile.base中如何安装Python 3.13运行时、UV包管理器,并配置清华源以加速依赖下载。解释如何通过pyproject.toml和uv.lock实现确定性依赖安装,并预装FastAPI、SQLAlchemy等复杂Python包。重点描述Playwright的集成过程:包括系统级依赖(如libglib、libx11)的安装和Chromium浏览器的预下载,确保开箱即用的浏览器自动化能力。分析build-base-image.sh脚本如何通过USE_PROXY环境变量切换代理设置,适应不同网络环境。强调非root用户运行的安全配置。提供构建命令的实际示例,并说明生成的kami-spider-base:latest镜像如何显著提升爬虫应用的构建效率。结合代码库内容,展示该镜像在处理反爬虫、页面渲染等场景中的优势,为开发者提供最佳实践指导。","order":4,"progress_status":"completed","dependent_files":"kami-spider-monorepo/Dockerfile.base,kami-spider-monorepo/build-base-image.sh,kami-spider-monorepo/pyproject.toml,kami-spider-monorepo/uv.lock,kami-spider-monorepo/README.md","gmt_create":"2025-11-09T23:07:27.829743+08:00","gmt_modified":"2025-11-09T23:11:10.925228+08:00","raw_data":"WikiEncrypted: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"},{"id":"779d5d86-9d89-456c-9f5b-7dc9e122f01e","repo_id":"7344f110-a8d0-446b-a0f4-7d8e507bccd2","name":"Playwright集成","description":"kami-spider-playwright-integration","prompt":"专门针对Playwright集成编写详细文档,说明如何在Docker镜像中实现开箱即用的浏览器自动化能力。详细列出Dockerfile.base中安装的所有系统级依赖(如libx11-6、libnss3、libasound2等),并解释其对Chromium运行的必要性。描述Chromium浏览器的预下载机制及其在容器内的存储路径。提供Playwright Python API的使用示例代码,展示如何启动浏览器、拦截请求、处理反爬检测。说明如何通过环境变量控制是否安装Playwright及其浏览器,以适应不同使用场景。包含常见问题如‘Browser closed unexpectedly’的解决方案。","parent_id":"3e5a6a0d-ff7f-445f-9d0a-2fe8bf1feb37","order":4,"progress_status":"completed","dependent_files":"kami-spider-monorepo/Dockerfile.base,kami-spider-monorepo/build-base-image.sh","gmt_create":"2025-11-09T23:07:53.827144+08:00","gmt_modified":"2025-11-09T23:16:41.812703+08:00","raw_data":"WikiEncrypted:ASPW4qx/mEg7V7YbLjHCJZBC8mhbljgoMjWDHHCmowAtniSjJlLzXJQJMlgLq5mnQ0tQlPzohOOY3FBVcG+r/1ghv0BAtzXsdyX9oXECjM+nJhx5YCFIKleALevcRrLPIYclNDxoOgwzzf65AJHncuYi5pCYXDrQhIims32ZUlO2tkb5W4zoU/CKSxNdROSakcaLLoI6n6uOKk6WrIXD3EIyy9sPxbv6269WlRIQu76Y1rxHdGV1cZtD/q66PPMxaTbue9zgWfskevP8oQ7uZiA1kTvH+AwZT0lzPylgm0HLfStEojyL5TLx0bjb9FiMia4MjPLmWeAPmq4VdmfHdyUXU/sD/O6GDQJRkpO/MHHDeWHUeZpnxZ1Do/Di2OPPxFEqeM24sM95bdqMqh9e+mBxj4kJka8uJ2A4s3ngYPK+MqwMB2Tzz70E2YffhR1np7KuZRqESgb5GQ04kcaPkOnQFKSnuR84+gkTgOKVA/+ZaLcUGgAnpxhR7psHL3qB85FcDuFT9D2KJ5pKo3PCC8/tEu+AGmhCu1pJEY6PQXpyHeq+F5swEnBYoeTk573zMtN7HXVo916pGfPM77LG1hT/P6u9yUwfzez02Mzn64OwJ1pbw3X8mkbpZKBX7GIaemS3HqAnPJAerDEabVFGlostRGI/jqvBX3gW/erVtLf5m3xmmgtbbQES/47EEtThh57tJ/BEjBWvWju1Tuf9Hm3XO10jELZYN89G4S1k6xS5pPAicLzXeBX2cWNQEj0BehRP70hPw6csyvOnR4Y5PJhKa6dKC6XqF1F7/CpAMgUfOeidaL333sm8eNJ31efRyXK14JpixSplB3saBi41Pv6Lo5NGXZDUW2wVXvVcCa7outJnsX14I/NZ8zhiLoY0Zap01OQxxEUab55dkxx53Ewvuyo4z4tc53HO+IrUneWDaOej13RzyqtKfUWtgFuSnFLxCQW8U/umanDqquRIxobM5HinZbR38YN0Z0GtHUOTifN7/U7tT9Fchgui2rtwULqGcHQs5BCXPMyasDhOqUMIyQYhAvzdMv1pkEo53tgNOIXG8kKV6oQpZyTtBlOeQvDQL+Uacd7fbRCUF8rU40GJwM3+/QqWaS5t6XZD677vKIpB7Yt4X+3BBYe3/NIJ5ChlalRbiX1lbJtlQ25jd/wAL7IUkM4XdPDUqgF84TSq1EAd/KUjAV6TKQQdnKtcpI6KCftoyAOpNh7W9yj9qTnmWA6xLP3YXwIYo6ez5T+uDBU7h58pzt5uNiHsj2MLCqilnaIvvWE4sI+U8z2kyVdnWLMsf6AOMRSEVaEUmDRfCLOZif4GVDicPMEZYBbWB9Jf1IalDT2qKtDePesuTra42mzPV9gciPMEjutodvFpR/ts5UX5b0kxxOlGzFg9FQS85RHmnhJoMejs0sqv294/o3TTKCbNzNzH7EmJsFw=","layer_level":1},{"id":"70da6621-4cb5-4c38-b07c-6f60aed77743","repo_id":"7344f110-a8d0-446b-a0f4-7d8e507bccd2","name":"通用构建指南","description":"build-process-guide","prompt":"创建通用构建流程的权威指南,系统化地解析所有模块共用的构建机制。深入分析build-base-image.sh脚本的实现逻辑:如何统一处理DOCKER_REGISTRY、VERSION、USE_PROXY等环境变量,如何动态生成Docker镜像标签(latest、版本号、仓库前缀),以及如何执行docker build、docker tag和docker push命令。对比三个模块中构建脚本的异同,提炼出可复用的构建模式。详细说明每个环境变量的具体作用和使用场景,例如USE_PROXY=1如何启用中国代理加速,DOCKER_REGISTRY如何指定私有仓库地址。提供脚本调试技巧,如启用set -x跟踪执行过程。总结构建过程中的最佳实践,包括镜像版本管理、构建缓存利用和错误处理机制。通过跨模块的综合示例,帮助开发者掌握整个项目的构建体系,提升自动化和可维护性。","order":5,"progress_status":"completed","dependent_files":"alpine-base/build-base-image.sh,kami-gateway/build-base-image.sh,kami-spider-monorepo/build-base-image.sh","gmt_create":"2025-11-09T23:07:27.830616+08:00","gmt_modified":"2025-11-09T23:10:30.434814+08:00","raw_data":"WikiEncrypted:ZHd6gDb1oAMJeik+Vv5fPoz/jX+zxb0mgqH/BhlMleNwOwjMdns3v8QxJft36VZZ1Ra2n2FjapsC21gS/q0slRh13bwOPBWPql3C1r0kfzTmG5aiClK0KQ4Rrk38ygcFlPllzAYU/Y496RyCVgc9ZG2LFFVaNaLmZ5KE7j8JDMAnmFumc3KvD1bdFMKlPUKsK+yOhtgjd2Y50kmZ5qEMbBlPqKA4filJsyvjLVCWaUJpGsIep6W3UGr23j/oT8Ul0NhibQQA7w9gDSe5b7gkq05PFgw3PG1bkh26Ez9PppawPvJYFeK45LsFX0i/iM3sztoWXqwXISacDQvXWWX2vvkokqasHf15IUMBO2Thoa16VS/z0Rmmo1f8iKZsxXEVWZ02ySQ+0mMfp81cK/y5cCD4wHbWqHvMZI5vaGwvfvXs9WOnsy86e7xdtkGcKuagP44lnRRQ9Kme6V/h/A+Obpj/SZB1deaWE1MDFQb0j0lboo9OFaJhfknW4rSv7IdEQNESoqM/aRtGy/Jdhp30zJkOLw1yZMQOT2Q/IDEd3s/KYOwYT8ybRKzQPkuJOOCL1H4F9TJz5k5VLs0iK/gQSjkiPePoWLF8uuMpme4mr4EONmMMZoEuKxb6QC6F/DWBfPrZBA2cyTz6quDByNHqPntvHIIY/s4Sc2TzsLqeF5ZgnYI8JClqRL7uW8UFH6384d3JLPBpgHW0+YBdiVRl3lTpHQWIMOxAw7GOA4FBCAXu+YoAk6/mUhMiFJhdgu7lMZpZXNgGO4NAb5N3Yg/RN3V+My2mHr8GSgPSQUWBXGRNhAG5LA1vOOCe7iJfbZuPTxYP77RRvnhFdIvTbIp1ZVegrMoFN8I8m3rg52eL+MYejzpiBFQLPB/NodCa3fiPDyCC3uQiS73swQTNFQ6Gme+tVkzO+njdUi2WskRkEEIyFIu2uRtGfO9DatOdEjm+a5sI39A+x8JvGIWwa0F4hPUKL2cKyjRld+O33PSIQyNCr0NduPBCDchvxViKKfZAZTqm3xRzMJ9h3ZlkyGOPGAnIRSJtd/F8eOEfoADY3obrq8yRjePAWioA3uPwDu68nVscmcPRHDAZzLyULp2Bfe6w4OoMjFQI786+xvNZ7Rj2nk3oaG24GWRaYg0HPfFJy3dc3amx4ASICV94+h3CEdSRFnQF43qkkeGFctyBgVea6bx0a18EKvhNvKg/KRvB79r3LAF7mHJJD0yyoqPSbOD9CsEh4Lc4H2OCZZ9FSaI1YK99Hn70sxHDBkC7w0ynQEHIBIQaIhvoVMPV7ES7Acru7QUkeiym9UZFyIO6zd5SVIj6wYuxIWnMzyetdJG+8Cni+f0C62fzhq7BgVCKh+jpAMS9Aq7PGldAAhhdkKrQZJeE1bLZfHUH4abJgz0n0uxem5oVHUZVHO2GmHfkQ6RAt8tP8/GRYayzCLUbTdgrzKBf1149tc45QG5wZUDoC99QlVBuPraVrw0toDy7haJ7v+vj7Vh9694aFVVFSr3P9phlN9VnbJUfYkEG8WEDPZy4+09g7r0VvXXElIbO4NVxl6+OVk9+Fo99FATyJMCcBcSUzldtY/tOxQkR/MwGo8nhWh+pkYSVAK2xCeMtlPcJ0/VSanfFzxJ7ohBb5AAs4s+vtcTeN7p1qTk/kGUgaUQYRQygXR5Np4V2tWAfZaLkIFzUxFLohZuR5NjDWCYhaC/rH1LdaNZmEQmneH23IeFFTkmR1URgNmHxlYl4X0Zf1Mg5og99vUWaqE7lBHs="}],"wiki_items":[{"catalog_id":"7e3ebf37-1574-48e6-91fd-c38325ba1c0d","title":"alpine-base 模块","description":"alpine-base-module","extend":"{}","progress_status":"completed","repo_id":"7344f110-a8d0-446b-a0f4-7d8e507bccd2","id":"68b7dc3f-a5a7-4730-81d1-38e8c2f88b98","gmt_create":"2025-11-09T23:09:00.383526+08:00","gmt_modified":"2025-11-09T23:09:00.385166+08:00"},{"catalog_id":"87858ac0-b4c3-45d6-b46e-5b9aa92027dc","title":"快速开始","description":"getting-started","extend":"{}","progress_status":"completed","repo_id":"7344f110-a8d0-446b-a0f4-7d8e507bccd2","id":"5de39294-77a1-4f26-b9e5-8d22ab8a9499","gmt_create":"2025-11-09T23:09:18.772042+08:00","gmt_modified":"2025-11-09T23:09:18.775452+08:00"},{"catalog_id":"03f420dc-94ba-4438-939d-b3cbb95856eb","title":"项目概述","description":"project-overview","extend":"{}","progress_status":"completed","repo_id":"7344f110-a8d0-446b-a0f4-7d8e507bccd2","id":"2ecaaf95-655f-4d6d-bb65-5b3a221d0e19","gmt_create":"2025-11-09T23:09:27.671667+08:00","gmt_modified":"2025-11-09T23:09:27.674249+08:00"},{"catalog_id":"70da6621-4cb5-4c38-b07c-6f60aed77743","title":"通用构建指南","description":"build-process-guide","extend":"{}","progress_status":"completed","repo_id":"7344f110-a8d0-446b-a0f4-7d8e507bccd2","id":"3bf7ce2c-59b1-438f-ae79-28203309703a","gmt_create":"2025-11-09T23:10:30.429109+08:00","gmt_modified":"2025-11-09T23:10:30.435416+08:00"},{"catalog_id":"bed2c9b4-de63-4b03-8187-d62744475754","title":"kami-gateway 模块","description":"kami-gateway-module","extend":"{}","progress_status":"completed","repo_id":"7344f110-a8d0-446b-a0f4-7d8e507bccd2","id":"12203115-71b4-4691-88bf-ab11564b9fe8","gmt_create":"2025-11-09T23:10:33.88887+08:00","gmt_modified":"2025-11-09T23:10:33.893734+08:00"},{"catalog_id":"3e5a6a0d-ff7f-445f-9d0a-2fe8bf1feb37","title":"kami-spider-monorepo 模块","description":"kami-spider-module","extend":"{}","progress_status":"completed","repo_id":"7344f110-a8d0-446b-a0f4-7d8e507bccd2","id":"0b98aaa0-f8b6-4519-9e33-da448e5d46bc","gmt_create":"2025-11-09T23:11:10.921077+08:00","gmt_modified":"2025-11-09T23:11:10.925657+08:00"},{"catalog_id":"07c159d7-3fa1-4dca-a4ea-502f25f5b08c","title":"基础镜像构建","description":"kami-gateway-base-image","extend":"{}","progress_status":"completed","repo_id":"7344f110-a8d0-446b-a0f4-7d8e507bccd2","id":"295c1192-6d0a-4dd0-9d9d-382ac911c205","gmt_create":"2025-11-09T23:11:27.961286+08:00","gmt_modified":"2025-11-09T23:11:27.965348+08:00"},{"catalog_id":"78097928-b28e-4f2f-9fef-370b9329d92a","title":"alpine-base 模块","description":"alpine-base-module","extend":"{}","progress_status":"completed","repo_id":"7344f110-a8d0-446b-a0f4-7d8e507bccd2","id":"adc2875e-7302-4520-9bbd-8a5f67213877","gmt_create":"2025-11-09T23:11:54.502101+08:00","gmt_modified":"2025-11-09T23:11:54.505794+08:00"},{"catalog_id":"2fd9ad61-bf0f-4453-b139-5c069562d31d","title":"构建与使用","description":"kami-spider-build-usage","extend":"{}","progress_status":"completed","repo_id":"7344f110-a8d0-446b-a0f4-7d8e507bccd2","id":"2a4ff51e-641d-4f66-99fd-c5cf3faf8d68","gmt_create":"2025-11-09T23:12:40.581208+08:00","gmt_modified":"2025-11-09T23:12:40.584636+08:00"},{"catalog_id":"c24099c1-6bfb-40ce-9315-6fbc1e8741d7","title":"Go依赖管理","description":"kami-gateway-go-dependency","extend":"{}","progress_status":"completed","repo_id":"7344f110-a8d0-446b-a0f4-7d8e507bccd2","id":"30884903-1b75-4192-845c-61a90fc80d8b","gmt_create":"2025-11-09T23:13:09.420371+08:00","gmt_modified":"2025-11-09T23:13:09.422594+08:00"},{"catalog_id":"6160423e-0318-494a-afdf-c9f71305913d","title":"功能特性","description":"kami-spider-features","extend":"{}","progress_status":"completed","repo_id":"7344f110-a8d0-446b-a0f4-7d8e507bccd2","id":"192594ea-bb47-4a29-b16c-b6782eafb53e","gmt_create":"2025-11-09T23:13:38.926036+08:00","gmt_modified":"2025-11-09T23:13:38.929724+08:00"},{"catalog_id":"3cd6b111-cd55-4414-9a4b-23c4ecdd4953","title":"kami-gateway 模块","description":"kami-gateway-module","extend":"{}","progress_status":"completed","repo_id":"7344f110-a8d0-446b-a0f4-7d8e507bccd2","id":"603cb3a2-940c-4fb4-af92-1455c2e842f3","gmt_create":"2025-11-09T23:14:06.578094+08:00","gmt_modified":"2025-11-09T23:14:06.580304+08:00"},{"catalog_id":"269c6751-74e2-470b-aa81-73af9c865c7a","title":"配置选项","description":"kami-spider-configuration","extend":"{}","progress_status":"completed","repo_id":"7344f110-a8d0-446b-a0f4-7d8e507bccd2","id":"8525a571-0ae0-4153-9ba5-23d2de726ef4","gmt_create":"2025-11-09T23:14:22.105667+08:00","gmt_modified":"2025-11-09T23:14:22.113918+08:00"},{"catalog_id":"645a2e40-6ce6-4b5d-967b-5ccc8e45f41c","title":"改进型应用镜像","description":"kami-gateway-improved-image","extend":"{}","progress_status":"completed","repo_id":"7344f110-a8d0-446b-a0f4-7d8e507bccd2","id":"958d01c4-a4ce-441a-b1e6-464718390859","gmt_create":"2025-11-09T23:14:28.643639+08:00","gmt_modified":"2025-11-09T23:14:28.646075+08:00"},{"catalog_id":"c99b73ed-5093-4cbf-a45d-b1eee990f2d2","title":"CI/CD集成","description":"kami-gateway-cicd-integration","extend":"{}","progress_status":"completed","repo_id":"7344f110-a8d0-446b-a0f4-7d8e507bccd2","id":"b75ef0b1-14eb-4602-a372-8bc28c154516","gmt_create":"2025-11-09T23:15:18.133845+08:00","gmt_modified":"2025-11-09T23:15:18.136915+08:00"},{"catalog_id":"779d5d86-9d89-456c-9f5b-7dc9e122f01e","title":"Playwright集成","description":"kami-spider-playwright-integration","extend":"{}","progress_status":"completed","repo_id":"7344f110-a8d0-446b-a0f4-7d8e507bccd2","id":"b5946ba4-2b1f-431a-b8ea-87a1a62a6dff","gmt_create":"2025-11-09T23:16:41.808732+08:00","gmt_modified":"2025-11-09T23:16:41.813053+08:00"},{"catalog_id":"b88f3e9c-a57b-40bc-a946-71407634e380","title":"依赖管理","description":"kami-spider-dependency-management","extend":"{}","progress_status":"completed","repo_id":"7344f110-a8d0-446b-a0f4-7d8e507bccd2","id":"4044ee70-4d92-48cd-9ea5-f437be453797","gmt_create":"2025-11-09T23:17:09.552861+08:00","gmt_modified":"2025-11-09T23:17:09.554471+08:00"},{"catalog_id":"f53cebe0-d1f4-4508-a612-12121007a602","title":"基础镜像构建","description":"kami-gateway-base-image","extend":"{}","progress_status":"completed","repo_id":"7344f110-a8d0-446b-a0f4-7d8e507bccd2","id":"8cdcf2ee-6ed7-4ab6-96c8-82c39c3df207","gmt_create":"2025-11-09T23:17:28.957875+08:00","gmt_modified":"2025-11-09T23:17:28.962239+08:00"},{"catalog_id":"339675e9-e221-4ca5-9a18-b2390a6d1aee","title":"kami-spider-monorepo 模块","description":"kami-spider-monorepo-module","extend":"{}","progress_status":"completed","repo_id":"7344f110-a8d0-446b-a0f4-7d8e507bccd2","id":"3883b336-0b91-405e-8c5d-fe6b5f98462e","gmt_create":"2025-11-09T23:17:32.61158+08:00","gmt_modified":"2025-11-09T23:17:32.615566+08:00"},{"catalog_id":"d989e9db-0336-45b5-bb9a-08c65211d8cb","title":"Go依赖管理","description":"kami-gateway-dependency-management","extend":"{}","progress_status":"completed","repo_id":"7344f110-a8d0-446b-a0f4-7d8e507bccd2","id":"844ce3c6-c207-4f0f-9749-4a97ffb47912","gmt_create":"2025-11-09T23:17:52.27211+08:00","gmt_modified":"2025-11-09T23:17:52.275336+08:00"},{"catalog_id":"a26f150c-03d3-4768-9d40-9cf3981ff53a","title":"CI/CD集成与自动化","description":"kami-gateway-ci-cd-integration","extend":"{}","progress_status":"completed","repo_id":"7344f110-a8d0-446b-a0f4-7d8e507bccd2","id":"407e4974-151b-443a-958e-bb4048b3a58b","gmt_create":"2025-11-09T23:18:03.547215+08:00","gmt_modified":"2025-11-09T23:18:03.550607+08:00"},{"catalog_id":"807c5414-dbc5-4fb4-98d1-34245f938219","title":"应用镜像构建指南","description":"kami-gateway-application-image","extend":"{}","progress_status":"completed","repo_id":"7344f110-a8d0-446b-a0f4-7d8e507bccd2","id":"e3d57446-2281-49ee-84bf-50106e329c6e","gmt_create":"2025-11-09T23:18:39.24271+08:00","gmt_modified":"2025-11-09T23:18:39.247106+08:00"}],"wiki_overview":{"content":"\u003cblog\u003e\n# 项目综合分析报告\n\n## 1. 项目介绍\n\n该项目是一个基于 Docker 的容器化基础镜像构建系统,主要为多个微服务或应用提供标准化的基础镜像。项目包含三个核心模块:通用 Alpine 基础镜像、Go 语言网关服务基础镜像和 Python 爬虫平台单体仓库基础镜像。其核心目标是通过统一的构建流程和优化配置,提升开发效率、部署一致性与运行时性能。\n\n项目主要服务于后端开发团队、DevOps 工程师以及微服务架构下的服务维护人员,适用于需要高可移植性、轻量化容器环境的生产场景。\n\n## 2. 技术架构\n\n### 组件分解\n\n- **alpine-base**:提供一个经过优化的通用 Alpine Linux 基础镜像,集成中国镜像源、时区设置、常用工具及自定义证书。\n- **kami-gateway**:基于 Go 语言的 API 网关基础镜像,预装 Go 构建环境与依赖管理,支持快速编译部署。\n- **kami-spider-monorepo**:面向 Python 的爬虫服务平台基础镜像,集成 FastAPI 框架、Playwright 浏览器自动化工具及完整的依赖链。\n\n### 设计模式\n\n采用“分层构建 + 共享基础”的设计思想,各子项目独立但共享构建脚本结构(`build-base-image.sh`),并通过 Docker 多阶段构建实现环境隔离与最小化镜像输出。使用非 root 用户运行容器以增强安全性,并通过环境变量控制构建行为(如代理、版本等)。\n\n### 系统关系与数据流\n\n```mermaid\nflowchart TD\n A[开发者] --\u003e B[执行 build-base-image.sh]\n B --\u003e C{选择构建目标}\n C --\u003e D[alpine-base]\n C --\u003e E[kami-gateway]\n C --\u003e F[kami-spider-monorepo]\n D --\u003e G[Docker Build]\n E --\u003e G\n F --\u003e G\n G --\u003e H[生成基础镜像]\n H --\u003e I[推送至私有/公共 Registry]\n I --\u003e J[CI/CD 或生产环境拉取使用]\n```\n\n## 3. 关键实现\n\n### 主要入口点\n- 构建脚本:`alpine-base/build-base-image.sh`\n- 镜像定义:`alpine-base/Dockerfile.base`\n- Go 模块配置:`kami-gateway/go.mod`\n- Python 项目配置:`kami-spider-monorepo/pyproject.toml`\n\n### 核心模块\n- **Dockerfile.base**:定义各基础镜像的具体构建步骤,包括系统依赖安装、用户创建、工作目录设置等。\n- **build-base-image.sh**:统一的构建入口脚本,负责镜像构建、打标与推送逻辑。\n\n### 配置方式\n通过环境变量(如 `DOCKER_REGISTRY`, `VERSION`, `USE_PROXY`)实现灵活配置,支持本地测试与生产部署之间的无缝切换。\n\n### 外部依赖\n- Go 模块依赖:由 `go.mod` 管理,涵盖 Beego、Sonic、OpenTelemetry 等高性能库。\n- Python 依赖:由 `pyproject.toml` 和 `uv.lock` 管理,使用现代工具链 UV 进行依赖同步。\n\n### 集成点\n- 私有镜像仓库(默认 `git.oceanpay.cc/danial`)\n- OpenTelemetry 监控体系\n- Playwright 浏览器自动化集成\n- 中国镜像加速(阿里云、清华源)\n\n### 组件关系图\n\n```mermaid\ngraph LR\n A[alpine-base] --\u003e B[kami-gateway]\n A --\u003e C[kami-spider-monorepo]\n B --\u003e D[Go 应用容器]\n C --\u003e E[Python 爬虫服务]\n D --\u003e F[(私有 Registry)]\n E --\u003e F\n F --\u003e G[Kubernetes / Docker Swarm]\n```\n\n## 4. 核心功能\n\n### 功能概述\n- 提供轻量、安全、可复用的基础 Docker 镜像\n- 支持多语言环境(Go、Python)的服务部署\n- 内置中国镜像加速与证书信任机制\n- 支持 OpenTelemetry 分布式追踪与监控\n- 集成 Playwright 实现无头浏览器爬虫能力\n\n### 实现亮点\n- 使用 `uv` 替代传统 `pip`,显著提升 Python 依赖安装速度\n- 所有镜像均以非 root 用户运行,符合最小权限原则\n- Playwright 浏览器在构建阶段预安装,避免运行时延迟\n- 构建脚本中集成镜像大小输出,便于性能监控\n\n### 功能状态图\n\n```mermaid\nstateDiagram-v2\n [*] --\u003e 构建开始\n 构建开始 --\u003e 镜像构建: 执行 build-base-image.sh\n 镜像构建 --\u003e 标签生成: 成功\n 标签生成 --\u003e 推送镜像: 非本地 Registry\n 推送镜像 --\u003e 构建完成: 成功\n 构建完成 --\u003e [*]\n 镜像构建 --\u003e 错误: 失败\n 错误 --\u003e [*]\n```\n\nSources:\n- [build-base-image.sh](alpine-base/build-base-image.sh)\n- [Dockerfile.base](alpine-base/Dockerfile.base)\n- [go.mod](kami-gateway/go.mod)\n- [pyproject.toml](kami-spider-monorepo/pyproject.toml)\n- [Dockerfile.base](kami-gateway/Dockerfile.base)\n- [Dockerfile.base](kami-spider-monorepo/Dockerfile.base)\n\u003c/blog\u003e","gmt_create":"2025-11-09T23:05:46.414743+08:00","gmt_modified":"2025-11-09T23:05:46.414743+08:00","id":"54adec79-d720-4f87-b583-c07fe23293f9","repo_id":"7344f110-a8d0-446b-a0f4-7d8e507bccd2"},"wiki_readme":{"content":"No readme file","gmt_create":"2025-11-09T23:05:08.59952+08:00","gmt_modified":"2025-11-09T23:05:08.59952+08:00","id":"994ae718-fa12-4385-aafd-1fbd75fe8b4c","repo_id":"7344f110-a8d0-446b-a0f4-7d8e507bccd2"},"wiki_repo":{"id":"7344f110-a8d0-446b-a0f4-7d8e507bccd2","name":"docker-registry","progress_status":"completed","wiki_present_status":"COMPLETED","optimized_catalog":"\".\\n├── alpine-base/\\n│ ├── README.md\\n│ └── build-base-image.sh\\n├── kami-gateway/\\n│ ├── README.md\\n│ ├── build-base-image.sh\\n│ ├── go.mod\\n│ └── go.sum\\n└── kami-spider-monorepo/\\n ├── README.md\\n ├── build-base-image.sh\\n ├── pyproject.toml\\n └── uv.lock\\n\"","current_document_structure":"WikiEncrypted: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","catalogue_think_content":"WikiEncrypted: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","recovery_checkpoint":"wiki_generation_completed","last_commit_id":"a26ab5f952814fa543ac5f6b00d5b050d21a6918","last_commit_update":"2025-11-09T23:02:43+08:00","gmt_create":"2025-11-09T23:05:06.944566+08:00","gmt_modified":"2025-11-09T23:18:39.330641+08:00","extend_info":"{\"language\":\"zh\",\"active\":true,\"branch\":\"master\",\"shareStatus\":\"\",\"server_error_code\":\"\",\"cosy_version\":\"\"}"}} \ No newline at end of file diff --git a/kami-gateway/Dockerfile.base b/kami-gateway/Dockerfile.base index 7f42fcb..c3e2c03 100644 --- a/kami-gateway/Dockerfile.base +++ b/kami-gateway/Dockerfile.base @@ -6,7 +6,7 @@ FROM golang:1.25-alpine # Set environment variables ENV TZ=Asia/Shanghai \ GO111MODULE=on \ - GOPROXY=https://goproxy.cn,direct \ + GOPROXY=https://goproxy.io,direct \ CGO_ENABLED=0 \ GOOS=linux \ GOARCH=amd64 diff --git a/kami-spider-monorepo/Dockerfile.base b/kami-spider-monorepo/Dockerfile.base index d761338..2ffc0a0 100644 --- a/kami-spider-monorepo/Dockerfile.base +++ b/kami-spider-monorepo/Dockerfile.base @@ -7,6 +7,7 @@ ENV PYTHONUNBUFFERED=1 \ UV_LINK_MODE=copy \ PATH="/app/.venv/bin:$PATH" \ UV_CACHE_DIR=/tmp/uv-cache \ + PLAYWRIGHT_BROWSERS_PATH=/app/.browsers \ PYDEVD_DISABLE=1 \ PYDEVD_DISABLE_FILE_VALIDATION=1 \ PYCHARM_DEBUG="false" \ @@ -40,6 +41,7 @@ COPY --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/uv # Create non-root user with home directory and set up directories RUN groupadd -r appuser && useradd -r -g appuser -d /home/appuser -m appuser \ && mkdir -p /app \ + && mkdir -p /app/.browsers \ && mkdir -p /home/appuser/.cache \ && chown -R appuser:appuser /app /home/appuser @@ -64,13 +66,21 @@ RUN if [ "$USE_PROXY" = "1" ]; then \ # Switch back to root user to install Playwright system dependencies USER root -# Install Playwright browsers with dependencies (requires root) -RUN /app/.venv/bin/playwright install chromium --with-deps && \ - /app/.venv/bin/playwright install-deps chromium +# Install Playwright system dependencies for chromium +RUN /app/.venv/bin/playwright install-deps chromium -# Switch back to non-root user +# Switch to appuser to install browsers (must be done by the user who will run them) USER appuser +# Install Playwright browsers to the shared path +RUN /app/.venv/bin/playwright install chromium + +# Switch back to root for final cleanup +USER root + +# Ensure browser cache directory has correct permissions for appuser +RUN chmod -R 755 /app/.browsers + # Label the image LABEL maintainer="kami-spider-team" \ version="1.0.0" \