Files
claude-code-router/docker-build-proxy.sh
gaoandClaude 8f47f4e9ea feat: 完善 DevOps 工具链配置和优化 Harbor 服务
- 更新 Gitea runner 配置,支持优化的 CI/CD 环境
- 完善 Harbor HTTPS 配置和远程访问支持
- 优化 Harbor 日志配置,改用 json-file 驱动
- 添加 Docker 构建加速和代理缓存脚本
- 新增完整的文档和使用指南
- 添加 AI 开发工具集成配置

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-03 06:39:53 +08:00

658 lines
17 KiB
Bash
Executable File

#!/bin/bash
# Docker 构建代理配置脚本
# 解决 apt/pip/npm install 等构建时网络超时问题
#
# 作者: Claude Code Assistant
# 版本: 1.0.0
set -e
# 配置变量
HARBOR_REGISTRY="192.168.1.83:8443"
HARBOR_USER="admin"
HARBOR_PASS="admin123"
# 代理配置 (根据你的网络环境调整)
# 如果你有代理服务器,请修改这里
HTTP_PROXY="${HTTP_PROXY:-}"
HTTPS_PROXY="${HTTPS_PROXY:-}"
NO_PROXY="localhost,127.0.0.1,192.168.1.83,192.168.*,10.*,172.16.*,.local,.internal"
# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
PURPLE='\033[0;35m'
CYAN='\033[0;36m'
NC='\033[0m'
info() { echo -e "${BLUE}INFO: $1${NC}"; }
success() { echo -e "${GREEN}SUCCESS: $1${NC}"; }
warning() { echo -e "${YELLOW}WARNING: $1${NC}"; }
error() { echo -e "${RED}ERROR: $1${NC}"; }
header() { echo -e "${PURPLE}🚀 $1${NC}"; }
step() { echo -e "${CYAN}▶ $1${NC}"; }
# 显示帮助信息
show_help() {
cat << EOF
Docker 构建代理配置脚本
用法:
$0 [选项]
选项:
-h, --help 显示此帮助信息
-p, --proxy URL 设置HTTP代理 (例如: http://127.0.0.1:7890)
-s, --socks URL 设置SOCKS代理 (例如: socks5://127.0.0.1:7890)
--detect 自动检测系统代理设置
--setup 配置Docker代理透传
--test 测试代理配置
--create-templates 创建构建模板文件
--status 显示当前配置状态
示例:
$0 --detect # 自动检测代理
$0 --proxy http://127.0.0.1:7890 # 配置HTTP代理
$0 --setup --create-templates # 完整配置并创建模板
$0 --test # 测试配置
EOF
}
# 检测系统代理设置
detect_proxy() {
header "检测系统代理设置..."
# 检查环境变量
if [ -n "$HTTP_PROXY" ]; then
info "发现 HTTP_PROXY: $HTTP_PROXY"
fi
if [ -n "$HTTPS_PROXY" ]; then
info "发现 HTTPS_PROXY: $HTTPS_PROXY"
fi
# 检查常见代理端口
for port in 7890 1087 8080 8888; do
if nc -z localhost $port 2>/dev/null; then
info "发现本地代理服务在端口: $port"
PROXY_URL="http://127.0.0.1:$port"
echo "建议代理地址: $PROXY_URL"
fi
done
# 检查 Clash 等工具
if pgrep -f "clash" > /dev/null; then
info "检测到 Clash 进程,通常代理端口为 7890"
PROXY_URL="http://127.0.0.1:7890"
echo "建议代理地址: $PROXY_URL"
fi
# 检查 Shadowsocks
if pgrep -f "shadowsocks" > /dev/null; then
info "检测到 Shadowsocks 进程"
fi
success "代理检测完成"
}
# 配置 Docker daemon 代理
configure_docker_daemon_proxy() {
header "配置 Docker daemon 代理..."
if [ -z "$HTTP_PROXY" ] && [ -z "$HTTPS_PROXY" ]; then
warning "未设置代理地址,跳过 Docker daemon 配置"
return
fi
# 创建 Docker 配置目录
DOCKER_CONFIG_DIR="$HOME/.docker"
mkdir -p "$DOCKER_CONFIG_DIR"
# 创建 daemon 配置
DAEMON_CONFIG="$DOCKER_CONFIG_DIR/config.json"
if [ -f "$DAEMON_CONFIG" ]; then
backup "$DAEMON_CONFIG"
fi
# 生成新的配置
cat > "$DAEMON_CONFIG" << EOF
{
"proxies": {
"default": {
"httpProxy": "$HTTP_PROXY",
"httpsProxy": "$HTTPS_PROXY",
"noProxy": "$NO_PROXY"
}
},
"registry-mirrors": [
"https://syxpn3chjq4bgj.xuanyuan.run",
"https://$HARBOR_REGISTRY"
],
"insecure-registries": [
"syxpn3chjq4bgj.xuanyuan.run",
"$HARBOR_REGISTRY"
],
"max-concurrent-downloads": 15,
"experimental": true,
"features": {
"buildkit": true
}
}
EOF
success "Docker daemon 代理配置完成"
info "需要重启 Docker 服务使配置生效"
if command -v orbctl > /dev/null 2>&1; then
info "使用 OrbStack,请重启 OrbStack"
info "或在 OrbStack 设置中手动配置代理"
else
info "使用 Docker Desktop,请在设置中配置代理"
fi
}
# 创建构建配置模板
create_build_templates() {
header "创建构建配置模板..."
# 创建模板目录
TEMPLATES_DIR="./docker-build-templates"
mkdir -p "$TEMPLATES_DIR"
# 1. 创建代理 Dockerfile 模板
cat > "$TEMPLATES_DIR/Dockerfile.proxy" << 'EOF'
# Dockerfile 模板 - 启用代理支持
# 解决构建时 apt/pip/npm 网络超时问题
ARG HTTP_PROXY
ARG HTTPS_PROXY
ARG NO_PROXY
ENV HTTP_PROXY=${HTTP_PROXY}
ENV HTTPS_PROXY=${HTTPS_PROXY}
ENV NO_PROXY=${NO_PROXY}
# 选择基础镜像 (根据需要修改)
FROM ubuntu:22.04
# 如果需要使用国内镜像源,取消下面的注释
# RUN sed -i 's@http://archive.ubuntu.com@https://mirrors.aliyun.com@g' /etc/apt/sources.list || \
# sed -i 's@http://security.ubuntu.com@https://mirrors.aliyun.com@g' /etc/apt/sources.list
# 配置 apt 代理 (如果设置了代理)
RUN if [ -n "${HTTP_PROXY}" ]; then \
echo "Acquire::http::Proxy \"${HTTP_PROXY}\";" > /etc/apt/apt.conf.d/01proxy && \
echo "Acquire::https::Proxy \"${HTTPS_PROXY}\";" >> /etc/apt/apt.conf.d/01proxy; \
fi
# 更新包管理器并安装依赖 (使用重试机制)
RUN apt-get update --fix-missing || \
(sleep 10 && apt-get update --fix-missing) || \
(sleep 30 && apt-get update --fix-missing) && \
apt-get install -y --no-install-recommends \
ca-certificates \
curl \
wget \
gnupg \
&& rm -rf /var/lib/apt/lists/*
# 后续构建步骤...
# RUN apt-get install -y your-dependencies
# COPY . /app
# WORKDIR /app
# RUN your-build-commands
# CMD ["your-app"]
EOF
# 2. 创建多阶段构建模板 (支持缓存)
cat > "$TEMPLATES_DIR/Dockerfile.multi-stage" << 'EOF'
# 多阶段构建模板 - 支持构建缓存和代理
ARG HTTP_PROXY
ARG HTTPS_PROXY
ARG NO_PROXY
# 构建阶段
FROM golang:1.21-alpine AS builder
# 继承代理参数
ARG HTTP_PROXY
ARG HTTPS_PROXY
ARG NO_PROXY
ENV HTTP_PROXY=${HTTP_PROXY}
ENV HTTPS_PROXY=${HTTPS_PROXY}
ENV NO_PROXY=${NO_PROXY}
# 如果使用国内镜像源,取消注释
# RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
# 安装构建依赖
RUN apk add --no-cache git ca-certificates
# 设置工作目录
WORKDIR /app
# 配置 Go 代理
ENV GOPROXY=https://goproxy.cn,direct
ENV GOSUMDB=sum.golang.google.cn
# 使用缓存挂载下载依赖
RUN --mount=type=cache,target=/go/pkg/mod \
--mount=type=cache,target=/root/.cache/go-build \
go mod download
# 复制源代码
COPY go.mod go.sum ./
RUN --mount=type=cache,target=/go/pkg/mod \
go mod verify
COPY . .
RUN --mount=type=cache,target=/root/.cache/go-build \
CGO_ENABLED=0 GOOS=linux go build -o /app/server .
# 运行阶段
FROM alpine:3.18
# 安装运行时依赖
RUN apk add --no-cache ca-certificates tzdata curl
# 设置时区
ENV TZ=Asia/Shanghai
# 复制二进制文件
COPY --from=builder /app/server /app/server
WORKDIR /app
EXPOSE 8080
CMD ["./server"]
EOF
# 3. 创建带代理的构建脚本
cat > "$TEMPLATES_DIR/build-with-proxy.sh" << EOF
#!/bin/bash
# 带代理的构建脚本
# 配置代理 (根据实际情况修改)
PROXY_URL="${PROXY_URL:-http://127.0.0.1:7890}"
IMAGE_NAME="\${1:-myapp}"
IMAGE_TAG="\${2:-latest}"
DOCKERFILE="\${3:-Dockerfile}"
if [ -z "\$PROXY_URL" ]; then
echo "❌ 未设置代理地址"
echo "用法: PROXY_URL=http://127.0.0.1:7890 $0 [image] [tag] [dockerfile]"
exit 1
fi
echo "🚀 构建镜像: \$IMAGE_NAME:\$IMAGE_TAG"
echo "🔗 代理地址: \$PROXY_URL"
echo "📄 Dockerfile: \$DOCKERFILE"
# 使用 BuildKit 构建
DOCKER_BUILDKIT=1 docker build \\
--build-arg HTTP_PROXY="\$PROXY_URL" \\
--build-arg HTTPS_PROXY="\$PROXY_URL" \\
--build-arg NO_PROXY="localhost,127.0.0.1,192.168.1.83" \\
-t "\$IMAGE_NAME:\$IMAGE_TAG" \\
-f "\$DOCKERFILE" \\
.
echo "✅ 构建完成"
EOF
chmod +x "$TEMPLATES_DIR/build-with-proxy.sh"
# 4. 创建 Docker Compose 模板
cat > "$TEMPLATES_DIR/docker-compose.proxy.yml" << 'EOF'
version: '3.8'
services:
app:
build:
context: .
dockerfile: Dockerfile
args:
HTTP_PROXY: ${HTTP_PROXY}
HTTPS_PROXY: ${HTTPS_PROXY}
NO_PROXY: ${NO_PROXY}
cache_from:
- 192.168.1.83:8443/build-cache/app:buildcache
cache_to:
- type=registry,ref=192.168.1.83:8443/build-cache/app:buildcache,mode=max
image: app:latest
ports:
- "8080:8080"
environment:
- HTTP_PROXY=${HTTP_PROXY}
- HTTPS_PROXY=${HTTPS_PROXY}
- NO_PROXY=${NO_PROXY}
# 可选:本地 apt 缓存代理
apt-cacher:
image: sameersbn/apt-cacher-ng:latest
ports:
- "3142:3142"
volumes:
- apt_cache_data:/var/cache/apt-cacher-ng
restart: unless-stopped
volumes:
apt_cache_data:
EOF
# 5. 创建 Kubernetes 构建模板
cat > "$TEMPLATES_DIR/k8s-build-with-proxy.yaml" << 'EOF'
apiVersion: v1
kind: ConfigMap
metadata:
name: build-config
data:
HTTP_PROXY: "http://proxy-service:7890"
HTTPS_PROXY: "http://proxy-service:7890"
NO_PROXY: "localhost,127.0.0.1,10.*,172.16.*,192.168.*,.svc,.cluster.local"
---
apiVersion: v1
kind: Pod
metadata:
name: kaniko-build
spec:
containers:
- name: kaniko
image: gcr.io/kaniko-project/executor:latest
args:
- "--dockerfile=Dockerfile"
- "--context=gs://my-bucket"
- "--destination=192.168.1.83:8443/myapp:latest"
- "--cache=true"
- "--cache-repo=192.168.1.83:8443/kaniko-cache"
- "--insecure"
envFrom:
- configMapRef:
name: build-config
restartPolicy: Never
EOF
# 6. 创建配置文件
cat > "$TEMPLATES_DIR/.env.example" << EOF
# 代理配置示例
# 取消注释并设置你的代理地址
# HTTP 代理
HTTP_PROXY=http://127.0.0.1:7890
HTTPS_PROXY=http://127.0.0.1:7890
# SOCKS 代理
# HTTP_PROXY=socks5://127.0.0.1:7890
# HTTPS_PROXY=socks5://127.0.0.1:7890
# 无代理地址
NO_PROXY=localhost,127.0.0.1,192.168.1.83,192.168.*,10.*,172.16.*,.local,.internal
# Harbor 配置
HARBOR_REGISTRY=192.168.1.83:8443
HARBOR_USER=admin
HARBOR_PASS=admin123
EOF
success "构建模板创建完成"
info "模板位置: $TEMPLATES_DIR/"
echo ""
echo "📚 可用模板:"
echo " 📄 Dockerfile.proxy - 基础代理 Dockerfile"
echo " 📄 Dockerfile.multi-stage - 多阶段构建模板"
echo " 🚀 build-with-proxy.sh - 代理构建脚本"
echo " 🐳 docker-compose.proxy.yml - Docker Compose 模板"
echo " ☸️ k8s-build-with-proxy.yaml - Kubernetes 构建模板"
echo " ⚙️ .env.example - 环境变量示例"
}
# 测试代理配置
test_proxy_config() {
header "测试代理配置..."
if [ -z "$HTTP_PROXY" ] && [ -z "$HTTPS_PROXY" ]; then
warning "未配置代理,无法测试"
return
fi
# 测试网络连接
info "测试网络连接..."
# 测试 apt 源连接
if curl -s --connect-timeout 10 --proxy "$HTTP_PROXY" http://deb.debian.org > /dev/null; then
success "✅ 通过代理访问 Debian 源成功"
else
error "❌ 通过代理访问 Debian 源失败"
fi
# 测试 Docker Hub 连接
if curl -s --connect-timeout 10 --proxy "$HTTP_PROXY" https://registry-1.docker.io > /dev/null; then
success "✅ 通过代理访问 Docker Hub 成功"
else
error "❌ 通过代理访问 Docker Hub 失败"
fi
# 测试构建
info "测试 Docker 构建..."
cat > /tmp/test-proxy.Dockerfile << 'EOF'
FROM alpine:3.18
RUN echo "Proxy test successful"
EOF
if docker build \
--build-arg HTTP_PROXY="$HTTP_PROXY" \
--build-arg HTTPS_PROXY="$HTTPS_PROXY" \
-t proxy-test /tmp/test-proxy.Dockerfile > /dev/null 2>&1; then
success "✅ Docker 代理构建测试成功"
docker rmi proxy-test > /dev/null 2>&1
else
error "❌ Docker 代理构建测试失败"
fi
rm -f /tmp/test-proxy.Dockerfile
success "代理配置测试完成"
}
# 显示配置状态
show_status() {
header "当前配置状态"
echo "🔧 系统信息:"
echo " 操作系统: $(uname -s)"
echo " 架构: $(uname -m)"
echo ""
echo "🐳 Docker 信息:"
if command -v docker > /dev/null; then
echo " Docker 版本: $(docker --version)"
echo " BuildKit: $(docker buildx version 2>/dev/null | head -1 || echo '不可用')"
else
echo " Docker: 未安装"
fi
echo ""
echo "🌐 代理配置:"
if [ -n "$HTTP_PROXY" ]; then
echo " HTTP_PROXY: $HTTP_PROXY"
else
echo " HTTP_PROXY: 未设置"
fi
if [ -n "$HTTPS_PROXY" ]; then
echo " HTTPS_PROXY: $HTTPS_PROXY"
else
echo " HTTPS_PROXY: 未设置"
fi
echo ""
echo "🏗️ Harbor 配置:"
echo " 地址: $HARBOR_REGISTRY"
echo " 用户: $HARBOR_USER"
echo ""
# 检查 Docker 配置文件
if [ -f "$HOME/.docker/config.json" ]; then
echo "📋 Docker 配置文件存在"
if grep -q "proxies" "$HOME/.docker/config.json"; then
echo " ✅ 代理配置已添加"
else
echo " ❌ 代理配置未添加"
fi
else
echo " ❌ Docker 配置文件不存在"
fi
}
# 备份文件
backup() {
local file="$1"
local backup_file="${file}.backup.$(date +%Y%m%d_%H%M%S)"
cp "$file" "$backup_file"
info "已备份: $file -> $backup_file"
}
# 主函数
main() {
# 解析命令行参数
while [[ $# -gt 0 ]]; do
case $1 in
-h|--help)
show_help
exit 0
;;
-p|--proxy)
HTTP_PROXY="$2"
HTTPS_PROXY="$2"
shift 2
;;
-s|--socks)
HTTP_PROXY="$2"
HTTPS_PROXY="$2"
shift 2
;;
--detect)
detect_proxy
exit 0
;;
--setup)
SETUP_MODE=true
shift
;;
--test)
test_proxy_config
exit 0
;;
--create-templates)
CREATE_TEMPLATES=true
shift
;;
--status)
show_status
exit 0
;;
*)
error "未知参数: $1"
show_help
exit 1
;;
esac
done
# 显示欢迎信息
header "Docker 构建代理配置工具"
echo ""
# 如果是设置模式
if [ "$SETUP_MODE" = true ]; then
step "1/5 检测系统代理..."
detect_proxy
echo ""
step "2/5 配置 Docker daemon 代理..."
configure_docker_daemon_proxy
echo ""
if [ "$CREATE_TEMPLATES" = true ]; then
step "3/5 创建构建模板..."
create_build_templates
echo ""
step "4/5 测试代理配置..."
test_proxy_config
echo ""
step "5/5 生成使用指南..."
generate_usage_guide
else
step "3/4 测试代理配置..."
test_proxy_config
echo ""
step "4/4 生成使用指南..."
generate_usage_guide
fi
else
# 默认显示状态和帮助
show_status
echo ""
show_help
fi
}
# 生成使用指南
generate_usage_guide() {
echo ""
header "📚 使用指南"
echo ""
echo "🚀 快速开始:"
echo " 1. 设置代理环境变量:"
echo " export HTTP_PROXY=http://127.0.0.1:7890"
echo " export HTTPS_PROXY=http://127.0.0.1:7890"
echo ""
echo " 2. 构建镜像:"
echo " docker build --build-arg HTTP_PROXY=\$HTTP_PROXY -t myapp ."
echo ""
echo " 3. 使用构建脚本:"
echo " cd docker-build-templates"
echo " ./build-with-proxy.sh myapp latest"
echo ""
echo "🔧 配置方法:"
echo " • 自动检测: $0 --detect"
echo " • 设置代理: $0 --proxy http://127.0.0.1:7890"
echo " • 完整配置: $0 --setup --create-templates"
echo " • 测试配置: $0 --test"
echo " • 查看状态: $0 --status"
echo ""
echo "📝 模板使用:"
echo " 1. 复制模板到你的项目:"
echo " cp docker-build-templates/Dockerfile.proxy ./Dockerfile"
echo ""
echo " 2. 配置环境变量:"
echo " cp docker-build-templates/.env.example ./.env"
echo " # 编辑 .env 文件设置代理地址"
echo ""
echo " 3. 构建镜像:"
echo " docker build -t myapp ."
echo ""
echo "💡 最佳实践:"
echo " • 开发环境: 使用本地代理 (Clash/Shadowsocks)"
echo " • CI/CD 环境: 使用内网代理或 apt-cacher-ng"
echo " • 生产环境: 预构建镜像推送到 Harbor"
echo " • 多架构构建: 使用 buildx + Harbor 缓存"
echo ""
success "配置完成!现在你可以享受高速的 Docker 构建体验了! 🎉"
}
# 执行主函数
main "$@"