Files
docker-registry/kami-gateway/README.md
danial 1a0a86bfeb chore(ci): 注释所有 drone.yml 中的触发分支配置
- 更改服务器主机地址和端口号
- 注释掉 main、master、develop、production 分支的触发器配置
- 取消自动触发事件的推送限制
- 保持 pipeline 配置完整性但禁用触发条件
- 方便后续手动触发或调整 CI 流程设置

chore(ci): 更新服务器地址和pipeline触发器配置,调整基础镜像代理设置

- 更新spider-base-image和alpine-base-image的服务器地址为38.55.194.49:3422
- 为main、master、develop和production分支的pipeline添加触发器注释,禁用自动执行
- 修改.dron.yml文件,恢复pipeline触发器的配置启用推送事件触发
- 更新kami-gateway和相关模块构建文档,反映最新的服务器地址和CI/CD配置变更
- 注释Dockerfile.base中的GOPROXY环境变量,将中国代理从goproxy.cn替换为goproxy.io
- 移除Alpine Linux阿里云镜像源配置,更新文档中相关代理和构建指引说明
- 增加依赖版本说明,包括新增goquery、stomp、zap等依赖版本精确声明
- 优化故障排查指南,提醒检查新的服务器地址和代理配置影响

chore(ci): 更新Docker注册表地址为新的域名

- 将Spider镜像构建中Docker注册表地址由git.oceanpay.cc改为git.domainpay.top
- 将Gateway镜像构建中Docker注册表地址由git.oceanpay.cc改为git.domainpay.top
- 将Alpine基础镜像构建中Docker注册表地址由git.oceanpay.cc改为git.domainpay.top
- 修改对应的docker login与logout命令以匹配新注册表地址
2025-12-17 15:34:04 +08:00

12 KiB
Raw Blame History

kami-gateway Base Image

高性能的 Go 应用基础 Docker 镜像,专为 kami-gateway 应用优化的多阶段构建解决方案。

📋 目录

🎯 概述

kami-gateway 基础镜像采用创新的分层构建策略,将编译环境和运行环境分离,显著提升构建效率和部署性能。

核心特性

  • 编译环境缓存: Go 1.25 编译工具链和依赖预安装
  • 运行时优化: 基于 Alpine Linux 的轻量级运行环境
  • 依赖预下载: 所有 Go 模块依赖提前缓存
  • 多阶段构建: 最终镜像仅包含运行时必需文件
  • 安全配置: 非 root 用户运行,最小权限原则

📁 文件结构

kami-gateway/
├── Dockerfile.base              # 基础镜像定义(编译环境)
├── Dockerfile.improved          # 应用镜像定义(多阶段构建)
├── build-base-image.sh          # 基础镜像构建脚本
├── go.mod                       # Go 模块配置
├── go.sum                       # Go 依赖版本锁定
├── .drone.yml                   # CI/CD 配置
├── cmd/                         # 应用入口
│   └── gateway/
│       └── main.go
├── internal/                    # 内部模块
│   ├── config/
│   ├── handlers/
│   ├── middleware/
│   └── services/
├── pkg/                         # 公共包
├── configs/                     # 配置文件
├── scripts/                     # 部署脚本
└── docs/                        # 文档

文件详细说明

文件/目录 用途 特点
Dockerfile.base 构建编译基础镜像 包含 Go 工具链、系统依赖、预下载模块
Dockerfile.improved 构建最终应用镜像 多阶段构建,基于 base 镜像快速编译
build-base-image.sh 自动化构建脚本 支持本地构建和仓库推送
go.mod/go.sum Go 模块管理 版本锁定,确保构建一致性

🚀 快速开始

前置要求

  • Docker 20.10+
  • Docker Compose (可选)
  • Go 1.25+ (本地开发)
  • 私有镜像仓库访问权限

本地开发环境

# 克隆项目
git clone <repository-url>
cd kami-gateway

# 安装依赖
go mod download

# 本地运行
go run cmd/gateway/main.go

# 运行测试
go test ./...

Docker 快速部署

# 1. 构建基础镜像
./build-base-image.sh

# 2. 构建应用镜像
docker build -f Dockerfile.improved -t kami-gateway:latest .

# 3. 运行容器
docker run -d \
  --name kami-gateway \
  -p 8080:8080 \
  -e ENV=production \
  kami-gateway:latest

Docker Compose 部署

version: '3.8'

services:
  kami-gateway:
    build:
      context: .
      dockerfile: Dockerfile.improved
    image: kami-gateway:latest
    container_name: kami-gateway
    restart: unless-stopped

    # 环境配置
    environment:
      - ENV=production
      - LOG_LEVEL=info
      - PORT=8080
      - DATABASE_URL=postgresql://user:pass@db:5432/kami
      - REDIS_URL=redis://redis:6379

    # 端口映射
    ports:
      - "8080:8080"

    # 健康检查
    healthcheck:
      test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:8080/health"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 40s

    # 依赖服务
    depends_on:
      - database
      - redis

    # 资源限制
    deploy:
      resources:
        limits:
          cpus: '1.0'
          memory: 512M
        reservations:
          cpus: '0.5'
          memory: 256M

  database:
    image: postgres:15-alpine
    environment:
      POSTGRES_DB: kami
      POSTGRES_USER: kami
      POSTGRES_PASSWORD: password
    volumes:
      - postgres_data:/var/lib/postgresql/data

  redis:
    image: redis:7-alpine
    volumes:
      - redis_data:/data

volumes:
  postgres_data:
  redis_data:

🔧 构建指南

构建基础镜像

# 基础构建
./build-base-image.sh

# 指定镜像仓库
DOCKER_REGISTRY=git.oceanpay.cc/danial ./build-base-image.sh

# 指定镜像标签
IMAGE_TAG=v1.2.0 ./build-base-image.sh

# 启用调试模式
DEBUG=1 ./build-base-image.sh

# 使用代理构建
USE_PROXY=1 ./build-base-image.sh

构建应用镜像

# 开发环境构建
docker build -f Dockerfile.improved -t kami-gateway:dev .

# 生产环境构建
docker build \
  -f Dockerfile.improved \
  --build-arg ENV=production \
  --build-arg VERSION=1.2.0 \
  -t kami-gateway:1.2.0 .

# 多平台构建
docker buildx build \
  -f Dockerfile.improved \
  --platform linux/amd64,linux/arm64 \
  -t kami-gateway:latest \
  --push .

构建脚本参数详解

#!/bin/bash

# 镜像仓库地址
DOCKER_REGISTRY=${DOCKER_REGISTRY:-"git.oceanpay.cc/danial"}

# 镜像标签
IMAGE_TAG=${IMAGE_TAG:-"latest"}

# 是否使用代理
USE_PROXY=${USE_PROXY:-"0"}

# 调试模式
DEBUG=${DEBUG:-"0"}

# 基础镜像名称
BASE_IMAGE_NAME="kami-gateway-base"

🏗️ 镜像架构

基础镜像 (kami-gateway-base)

# 构建阶段特征
FROM golang:1.25-alpine AS builder

# 系统配置
- Alpine Linux 3.18+
- 中国镜像源 (阿里云)
- 时区 Asia/Shanghai

# 开发工具
- Go 1.25 编译器
- Git 版本控制
- Make 构建工具
- Ca-certificates

# 依赖缓存
- 预下载所有 Go 模块
- 缓存 vendor 目录
- 编译时依赖预安装

应用镜像 (多阶段构建)

# 最终镜像特征
FROM git.oceanpay.cc/danial/alpine-base:latest

# 运行时组件
- 编译后的 Go 二进制文件
- 配置文件
- 必要的系统库
- 非 root 用户运行

# 体积优化
- 多阶段构建去除编译工具
- 静态编译减少外部依赖
- Alpine 基础镜像保持轻量

性能优化

构建性能

优化项 传统构建 优化构建 提升
构建时间 3-5 分钟 10-30 秒 10-20x
依赖下载 每次重新下载 预缓存复用 5-10x
镜像大小 800MB+ < 100MB 8x
缓存命中率 < 20% > 80% 4x

运行时性能

# 性能基准测试结果
Performance:
  startup_time: "< 1s"
  memory_usage: "30-50MB"
  cpu_efficiency: "高"
  response_time: "< 10ms"
  throughput: "1000+ req/s"

Optimization:
  go_gc: "调优"
  memory_pool: "复用"
  connection_pool: "数据库连接池"
  cache_strategy: "多级缓存"

内存优化

// 编译优化参数
GOFLAGS="-ldflags=-w -s"  // 去除调试信息
CGO_ENABLED=0             // 静态编译
GOOS=linux                // 目标操作系统
GOARCH=amd64              // 目标架构

⚙️ 配置管理

环境变量

# 应用配置
ENV=production                    # 运行环境
PORT=8080                       # 服务端口
LOG_LEVEL=info                  # 日志级别

# 数据库配置
DATABASE_URL=postgresql://...   # 数据库连接
DATABASE_MAX_CONNECTIONS=20     # 最大连接数
DATABASE_IDLE_CONNECTIONS=5     # 空闲连接数

# Redis 配置
REDIS_URL=redis://localhost:6379
REDIS_POOL_SIZE=10

# 性能配置
GOMAXPROCS=4                   # CPU 核心数
GOGC=100                       # GC 触发阈值

配置文件结构

# configs/config.yaml
server:
  host: "0.0.0.0"
  port: 8080
  read_timeout: "30s"
  write_timeout: "30s"
  idle_timeout: "60s"

database:
  host: "localhost"
  port: 5432
  name: "kami"
  ssl_mode: "disable"
  max_connections: 20

logging:
  level: "info"
  format: "json"
  output: "stdout"

metrics:
  enabled: true
  endpoint: "/metrics"
  interval: "30s"

📊 监控与日志

健康检查

// 健康检查端点
GET /health
{
  "status": "healthy",
  "timestamp": "2024-12-17T10:30:00Z",
  "uptime": "2h30m45s",
  "version": "1.2.0",
  "checks": {
    "database": "healthy",
    "redis": "healthy",
    "memory": "healthy"
  }
}

指标监控

# Prometheus 指标
Metrics:
  - http_requests_total
  - http_request_duration_seconds
  - http_connections_active
  - go_gc_duration_seconds
  - process_resident_memory_bytes
  - process_cpu_seconds_total

日志格式

{
  "level": "info",
  "timestamp": "2024-12-17T10:30:00Z",
  "request_id": "req-123456",
  "method": "GET",
  "path": "/api/v1/users",
  "status": 200,
  "duration": "15ms",
  "user_agent": "Mozilla/5.0...",
  "ip": "192.168.1.100"
}

🐛 故障排除

常见问题

1. 构建失败

# 问题Go 模块下载失败
# 解决:使用代理或更换镜像源
export GOPROXY=https://goproxy.cn,direct
export GOSUMDB=sum.golang.google.cn

# 或使用脚本参数
USE_PROXY=1 ./build-base-image.sh

2. 运行时错误

# 问题:权限不足
# 解决:检查用户权限
docker run --user 1001:1001 kami-gateway:latest

# 问题:端口占用
# 解决:检查端口使用情况
netstat -tulpn | grep 8080

3. 内存泄漏

# 问题:内存持续增长
# 解决:启用 GC 调试
export GODEBUG=gctrace=1
docker run -e GODEBUG=gctrace=1 kami-gateway:latest

4. 性能问题

# 性能分析
go tool pprof http://localhost:8080/debug/pprof/profile

# 内存分析
go tool pprof http://localhost:8080/debug/pprof/heap

# 协程分析
go tool pprof http://localhost:8080/debug/pprof/goroutine

调试命令

# 查看容器日志
docker logs -f kami-gateway

# 进入容器调试
docker exec -it kami-gateway /bin/sh

# 查看进程状态
docker exec kami-gateway ps aux

# 查看网络连接
docker exec kami-gateway netstat -tulpn

# 查看系统资源
docker stats kami-gateway

🔄 CI/CD 集成

Drone CI 配置

# .drone.yml
kind: pipeline
type: docker
name: kami-gateway

steps:
- name: build-base
  image: docker:24
  when:
    changes:
    - kami-gateway/**
  commands:
  - cd kami-gateway
  - ./build-base-image.sh

- name: build-app
  image: docker:24
  commands:
  - cd kami-gateway
  - docker build -f Dockerfile.improved -t kami-gateway:${DRONE_COMMIT_SHA:0:8} .

- name: test
  image: kami-gateway:${DRONE_COMMIT_SHA:0:8}
  commands:
  - go test ./...

- name: security-scan
  image: aquasec/trivy
  commands:
  - trivy image kami-gateway:${DRONE_COMMIT_SHA:0:8}

trigger:
  branch:
  - master
  - develop

GitHub Actions 配置

# .github/workflows/build.yml
name: Build and Deploy

on:
  push:
    branches: [master, develop]
  pull_request:
    branches: [master]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v3

    - name: Set up Docker Buildx
      uses: docker/setup-buildx-action@v2

    - name: Login to Registry
      uses: docker/login-action@v2
      with:
        registry: ${{ secrets.REGISTRY_URL }}
        username: ${{ secrets.REGISTRY_USERNAME }}
        password: ${{ secrets.REGISTRY_PASSWORD }}

    - name: Build Base Image
      run: |
        cd kami-gateway
        DOCKER_REGISTRY=${{ secrets.REGISTRY_URL }} ./build-base-image.sh

    - name: Build Application
      run: |
        cd kami-gateway
        docker build -f Dockerfile.improved -t kami-gateway:${{ github.sha }} .

    - name: Run Tests
      run: |
        docker run --rm kami-gateway:${{ github.sha }} go test ./...

    - name: Push Image
      if: github.ref == 'refs/heads/master'
      run: |
        docker push kami-gateway:${{ github.sha }}
        docker tag kami-gateway:${{ github.sha }} kami-gateway:latest
        docker push kami-gateway:latest

📈 版本信息

  • 当前版本: v1.2.0
  • Go 版本: 1.25
  • Alpine 版本: 3.18
  • 构建日期: 2024-12-17
  • 维护者: kami-gateway team

📞 支持与贡献


构建完成后镜像将标记为 kami-gateway-base:latest,建议在 CI/CD 流程中使用具体版本标签以确保部署一致性。