f1220a7905
- scripts/verify-goosed-docker.sh: 一键本地构建脚本 - docker-compose.local.yml: 本地开发环境 - docs/goosed-docker-local-verification.md: 本地测试指南 - docs/goosed-local-build-delivery.md: 构建交付说明 - docs/goosed-phase1-local-plan.md: 实施计划 完全本地化,无 CI 依赖,手工构建交付。
109 lines
2.7 KiB
Bash
Executable File
109 lines
2.7 KiB
Bash
Executable File
#!/bin/bash
|
|
# 本地验证 goosed Docker 镜像构建 & 运行
|
|
# 用法: bash scripts/verify-goosed-docker.sh [tag]
|
|
|
|
set -euo pipefail
|
|
|
|
TAG="${1:-local}"
|
|
IMAGE_NAME="tkmind/goosed:${TAG}"
|
|
CONTAINER_NAME="goosed-test-$$"
|
|
PORT=${GOOSE_PORT:-18006}
|
|
SECRET_KEY="${GOOSE_SERVER__SECRET_KEY:-test-secret-key-$(date +%s)}"
|
|
|
|
echo "=== Goosed Docker 镜像验证 ==="
|
|
echo "Image: $IMAGE_NAME"
|
|
echo "Port: $PORT"
|
|
echo ""
|
|
|
|
cleanup() {
|
|
echo "🧹 清理测试容器..."
|
|
docker rm -f "$CONTAINER_NAME" 2>/dev/null || true
|
|
docker volume rm goosed-test-$$-data 2>/dev/null || true
|
|
}
|
|
|
|
trap cleanup EXIT
|
|
|
|
# 1. 构建镜像(如果是 local 标签)
|
|
if [[ "$TAG" == "local" ]]; then
|
|
echo "📦 Step 1: 构建 Docker 镜像..."
|
|
docker build \
|
|
-f tkmind_go/Dockerfile.goosed \
|
|
-t "$IMAGE_NAME" \
|
|
tkmind_go/
|
|
echo "✅ 镜像构建完成"
|
|
else
|
|
echo "📥 Step 1: 拉取远程镜像..."
|
|
docker pull "$IMAGE_NAME"
|
|
echo "✅ 镜像拉取完成"
|
|
fi
|
|
|
|
echo ""
|
|
echo "🚀 Step 2: 启动容器..."
|
|
|
|
# 2. 创建数据卷
|
|
docker volume create "goosed-test-$$-data" || true
|
|
|
|
# 3. 启动容器
|
|
docker run -d \
|
|
--name "$CONTAINER_NAME" \
|
|
-p "${PORT}:18006" \
|
|
-e GOOSE_HOST=0.0.0.0 \
|
|
-e GOOSE_PORT=18006 \
|
|
-e "GOOSE_SERVER__SECRET_KEY=${SECRET_KEY}" \
|
|
-v "goosed-test-$$-data:/home/goose/.local/share/goose" \
|
|
"$IMAGE_NAME" \
|
|
agent
|
|
|
|
echo "✅ 容器已启动: $CONTAINER_NAME (PID: $(docker inspect -f '{{.State.Pid}}' "$CONTAINER_NAME"))"
|
|
|
|
# 4. 等待容器就绪
|
|
echo ""
|
|
echo "⏳ Step 3: 等待容器就绪(最多 30 秒)..."
|
|
for i in {1..30}; do
|
|
if docker exec "$CONTAINER_NAME" curl -sf "http://127.0.0.1:18006/status" >/dev/null 2>&1; then
|
|
echo "✅ 容器已就绪"
|
|
break
|
|
fi
|
|
if [[ $i -eq 30 ]]; then
|
|
echo "❌ 容器启动超时"
|
|
docker logs "$CONTAINER_NAME"
|
|
exit 1
|
|
fi
|
|
echo " ⏳ 等待中... ($i/30)"
|
|
sleep 1
|
|
done
|
|
|
|
# 5. 健康检查
|
|
echo ""
|
|
echo "🏥 Step 4: 健康检查..."
|
|
STATUS=$(docker exec "$CONTAINER_NAME" curl -s "http://127.0.0.1:18006/status" || echo '{}')
|
|
echo "Status: $STATUS"
|
|
|
|
# 6. 容器日志
|
|
echo ""
|
|
echo "📋 Step 5: 容器日志(最后 10 行)..."
|
|
docker logs "$CONTAINER_NAME" 2>&1 | tail -10
|
|
|
|
echo ""
|
|
echo "✅ 验证完成!"
|
|
echo ""
|
|
echo "容器信息:"
|
|
docker ps --filter "name=$CONTAINER_NAME" --format "table {{.Names}}\t{{.Ports}}\t{{.Status}}"
|
|
|
|
echo ""
|
|
echo "🧪 测试命令示例:"
|
|
echo " # 查看状态"
|
|
echo " curl http://127.0.0.1:${PORT}/status"
|
|
echo ""
|
|
echo " # 查看日志"
|
|
echo " docker logs -f $CONTAINER_NAME"
|
|
echo ""
|
|
echo " # 进入容器"
|
|
echo " docker exec -it $CONTAINER_NAME /bin/bash"
|
|
echo ""
|
|
echo "✋ 容器将在脚本退出时自动清理。按 Ctrl+C 停止。"
|
|
echo ""
|
|
|
|
# 保持容器运行直到用户中断
|
|
wait
|