Files
qiming/qiming-rcoder/make/docker.mk
2026-06-01 13:54:52 +08:00

153 lines
8.3 KiB
Makefile
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ============================================================================
# Docker 镜像构建
# ============================================================================
# Docker 镜像构建(仅构建镜像,不编译)
# 串行构建镜像,避免资源竞争
docker-build:
@echo "🔨 开始构建主镜像..."
@$(MAKE) docker-build-master & \
$(MAKE) docker-build-agent-runner & \
wait
@echo ""
@echo "✅ 所有 Docker 镜像构建完成!"
@echo " ✓ master-rcoder:latest"
@echo " ✓ rcoder-agent-runner:latest"
@echo ""
@echo "🎯 使用方式:"
@echo " docker run -d -p 8087:8087 master-rcoder:latest"
# 构建所有基础镜像(很少需要,只有修改系统依赖时才需要)
# 串行构建基础镜像,避免资源竞争
docker-build-base: docker-build-master-base docker-build-agent-base
@echo ""
@echo "✅ 所有基础镜像构建完成!"
@echo " ✓ master-rcoder-base:latest"
@echo " ✓ rcoder-agent-base:latest"
@echo ""
@echo "💡 提示: 平时开发只需运行 make dev-restart无需重新构建基础镜像"
# 构建主服务镜像(基于基础镜像,快速构建)
docker-build-master:
@echo "🐳 构建 master-rcoder 镜像..."
@echo "📍 镜像名称: master-rcoder:latest"
@# 检查基础镜像是否存在
@if ! docker image inspect master-rcoder-base:latest >/dev/null 2>&1; then \
echo "⚠️ 基础镜像 master-rcoder-base:latest 不存在,先构建基础镜像..."; \
$(MAKE) docker-build-master-base; \
else \
echo "✓ 基础镜像 master-rcoder-base:latest 已存在"; \
fi
@echo "📦 使用 Dockerfile 多阶段构建(基于基础镜像)..."
@# 🔧 根据 CARGO_FEATURES 决定是否启用 eBPF 调试
@(if [ "$(CARGO_FEATURES)" != "" ]; then \
MASTER_CARGO_FLAGS="$(CARGO_FEATURES)"; \
echo "🔧 master-rcoder 将启用 eBPF 调试模式"; \
else \
MASTER_CARGO_FLAGS=""; \
echo "🔒 master-rcoder 生产模式(无 eBPF 调试)"; \
fi; \
docker build \
--build-arg CARGO_FLAGS="$$MASTER_CARGO_FLAGS" \
--build-arg CACHEBUST=$$(date +%s) \
-f docker/rcoder-master/Dockerfile -t master-rcoder:latest .;)
@echo "✅ master-rcoder 镜像构建完成!"
@echo "📤 推送镜像到阿里云仓库..."
@docker tag master-rcoder:latest nuwax-docker-images-registry.cn-hangzhou.cr.aliyuncs.com/dev/master-rcoder:latest
@skopeo copy docker-daemon:nuwax-docker-images-registry.cn-hangzhou.cr.aliyuncs.com/dev/master-rcoder:latest docker://nuwax-docker-images-registry.cn-hangzhou.cr.aliyuncs.com/dev/master-rcoder:latest
@echo "✅ 镜像已推送: nuwax-docker-images-registry.cn-hangzhou.cr.aliyuncs.com/dev/master-rcoder:latest"
# 构建 master-base 基础镜像(包含所有运行时依赖,很少需要重新构建)
docker-build-master-base:
@echo "🐳 构建 master-rcoder-base 基础镜像..."
@echo "📍 镜像名称: master-rcoder-base:latest"
@echo "⏳ 这可能需要较长时间(包含所有运行时依赖安装)..."
@docker build -f docker/rcoder-master/Dockerfile.base -t master-rcoder-base:latest .
@echo "✅ master-rcoder-base 基础镜像构建完成!"
@echo "📤 推送基础镜像到阿里云仓库..."
@docker tag master-rcoder-base:latest nuwax-docker-images-registry.cn-hangzhou.cr.aliyuncs.com/dev/master-rcoder-base:latest
@skopeo copy docker-daemon:nuwax-docker-images-registry.cn-hangzhou.cr.aliyuncs.com/dev/master-rcoder-base:latest docker://nuwax-docker-images-registry.cn-hangzhou.cr.aliyuncs.com/dev/master-rcoder-base:latest
@echo "✅ 基础镜像已推送: nuwax-docker-images-registry.cn-hangzhou.cr.aliyuncs.com/dev/master-rcoder-base:latest"
@echo "💡 提示: 平时开发只需运行 make dev-restart无需重新构建基础镜像"
# ============================================================================
# Cargo feature 配置
# ============================================================================
# 开发模式:启用所有调试、监控和追踪功能
# ⚠️ 注意:添加新的调试 feature 时,必须同步更新此列表!
#
# 当前启用的调试 features
# - ebpf-debug (docker_manager, rcoder): eBPF 诊断工具
# - pyroscope (agent_runner): 性能分析 (CPU/Memory)
# - otel (agent_runner): OpenTelemetry 追踪
# - debug (rcoder): 调试路由
# - proxy (agent_runner): Pingora 反向代理Linux 容器默认开启)
# - kubernetes (rcoder, docker_manager): Kubernetes 运行时支持
# - http-server (agent_runner): HTTP REST API 服务(默认启用)
# - grpc-server (agent_runner): gRPC 服务(默认启用)
#
# 本地开发调试默认开启所有功能http-server 和 grpc-server 默认启用)
CARGO_FEATURES ?= --features ebpf-debug,pyroscope,otel,debug,proxy,kubernetes
# 构建 agent-runner 镜像(基于基础镜像,快速构建)
docker-build-agent-runner:
@echo "🐳 构建 rcoder-agent-runner 镜像..."
@echo "📍 镜像名称: rcoder-agent-runner:latest"
@# 检查基础镜像是否存在
@if ! docker image inspect rcoder-agent-base:latest >/dev/null 2>&1; then \
echo "⚠️ 基础镜像 rcoder-agent-base:latest 不存在,先构建基础镜像..."; \
$(MAKE) docker-build-agent-base; \
else \
echo "✓ 基础镜像 rcoder-agent-base:latest 已存在"; \
fi
@echo "📦 步骤1: 在 debian:12 环境中构建 agent_runner 二进制(确保 GLIBC 版本兼容)..."
@# 🔧 调试模式:默认启用 ebpf-debug feature允许使用 eBPF 诊断工具
@echo "🔧 Cargo features: $(CARGO_FEATURES)"
@# 计算业务代码哈希,只有代码变化时才重新编译(系统依赖和 Rust 安装保持缓存)
$(eval CRATES_HASH := $(shell find crates Cargo.toml Cargo.lock -name "*.rs" -o -name "Cargo.toml" -o -name "Cargo.lock" 2>/dev/null | sort | xargs cat 2>/dev/null | md5sum | cut -d' ' -f1))
@echo "🔑 业务代码哈希: $(CRATES_HASH)"
@# 🔥 关键修改:通过 CARGO_FEATURES 变量控制
@docker build --build-arg CRATES_HASH=$(CRATES_HASH) \
--build-arg CARGO_FLAGS="$(CARGO_FEATURES)" \
-f docker/rcoder-agent-runner/Dockerfile.build -t rcoder-agent-runner-build .
@echo "📦 步骤2: 复制二进制文件到 agent-runner 目录..."
@# 创建容器并复制 agent_runner 二进制文件
@mkdir -p docker/rcoder-agent-runner/bin
@docker create --name build-container rcoder-agent-runner-build
@docker cp build-container:/build/target/release/agent_runner docker/rcoder-agent-runner/bin/
@docker rm build-container
@docker rmi rcoder-agent-runner-build
@echo "📦 步骤3: 构建最终的 agent-runner 镜像(基于基础镜像,快速)..."
@# 🔧 根据 CARGO_FEATURES 决定是否安装 eBPF 工具
@(if [ "$(CARGO_FEATURES)" != "" ]; then \
INSTALL_EBPF="true"; \
echo "🔧 将安装 eBPF 诊断工具"; \
else \
INSTALL_EBPF="false"; \
echo "🔒 跳过 eBPF 工具安装(生产模式)"; \
fi; \
cd docker/rcoder-agent-runner && \
docker buildx build --platform linux/$(DOCKER_HOST_ARCH) --load \
--build-arg CACHEBUST=$$(date +%s) \
--build-arg INSTALL_EBPF_TOOLS="$${INSTALL_EBPF}" \
--build-arg INSTALL_PYROSCOPE="$${INSTALL_EBPF}" \
--build-arg INSTALL_ALLOY="$${INSTALL_EBPF}" \
-f Dockerfile -t rcoder-agent-runner:latest .;)
@echo "✅ rcoder-agent-runner 镜像构建完成!"
@if [ "$(CARGO_FEATURES)" != "" ]; then \
echo "🔧 eBPF 调试模式已启用,容器将以特权模式运行"; \
else \
echo "🔒 生产模式,容器权限受限"; \
fi
@echo "📤 推送镜像到阿里云仓库..."
@docker tag rcoder-agent-runner:latest $(K8S_IMAGE_REGISTRY)
@docker tag rcoder-agent-runner:latest nuwax-docker-images-registry.cn-hangzhou.cr.aliyuncs.com/dev/rcoder-agent-runner:latest
@skopeo copy docker-daemon:nuwax-docker-images-registry.cn-hangzhou.cr.aliyuncs.com/dev/rcoder-agent-runner:latest docker://nuwax-docker-images-registry.cn-hangzhou.cr.aliyuncs.com/dev/rcoder-agent-runner:latest
@echo "✅ 镜像已推送: nuwax-docker-images-registry.cn-hangzhou.cr.aliyuncs.com/dev/rcoder-agent-runner:latest"
# 构建生产版本(禁用 eBPF 工具,减小镜像大小)
docker-build-agent-production:
@echo "🐳 构建 rcoder-agent-runner 生产镜像(无 eBPF 工具)..."
@$(MAKE) docker-build-agent-runner CARGO_FEATURES=""
@echo "✅ 生产镜像构建完成(无 eBPF 工具,镜像更小)"