diff --git a/frameworks/milvus/2.6.12/Dockerfile b/frameworks/milvus/2.6.12/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..854e3c52ccaeccba5f5516131826c985b70531eb --- /dev/null +++ b/frameworks/milvus/2.6.12/Dockerfile @@ -0,0 +1,34 @@ +# Milvus Server 2.6.12 on OpenCloudOS 9 +# 从 Milvus 官方镜像提取二进制和库文件,在 OC9 容器中运行 +FROM opencloudos/opencloudos9-minimal:latest + +LABEL maintainer="OpenCloudOS Community" +LABEL org.opencontainers.image.source="https://gitee.com/OpenCloudOS/ai-agent-container" +LABEL org.opencontainers.image.description="Milvus Server 2.6.12 on OpenCloudOS 9" + +ARG MILVUS_VERSION=2.6.12 + +# 安装运行时依赖 +RUN dnf install -y ca-certificates curl libstdc++ openblas-serial libaio && dnf clean all && rm -rf /var/cache/yum/* && update-ca-trust + +# 从 Milvus 官方镜像提取二进制、库文件和配置到 OC9 +COPY --from=milvusdb/milvus:v2.6.12 /milvus/bin/milvus /usr/bin/milvus +COPY --from=milvusdb/milvus:v2.6.12 /milvus/lib/ /usr/local/lib/ +COPY --from=milvusdb/milvus:v2.6.12 /milvus/configs/ /etc/milvus/configs/ + +# 配置库路径 +ENV LD_LIBRARY_PATH=/usr/local/lib:${LD_LIBRARY_PATH} + +ENV MILVUSCONF=/etc/milvus/configs/ +ENV ETCD_USE_EMBED=true +ENV ETCD_DATA_DIR=/var/lib/milvus/etcd +ENV ETCD_CONFIG_PATH=/etc/milvus/configs/embedEtcd.yaml +ENV COMMON_STORAGETYPE=local +ENV DEPLOY_MODE=STANDALONE + +EXPOSE 19530 9091 +VOLUME /var/lib/milvus + +RUN echo $(date +"%Y-%m-%dT%H:%M:%S%z") > /opencloudos_build_date.txt + +CMD ["milvus", "run", "standalone"] diff --git a/frameworks/milvus/2.6.12/README.md b/frameworks/milvus/2.6.12/README.md new file mode 100644 index 0000000000000000000000000000000000000000..53fc589a68c16ddd71294d1a384135fc4c04f885 --- /dev/null +++ b/frameworks/milvus/2.6.12/README.md @@ -0,0 +1,59 @@ +# Milvus Server 2.6.12 on OpenCloudOS 9 + +## 简介 + +本镜像基于 OpenCloudOS 9 构建了 Milvus Server 2.6.12 的独立模式(Standalone)部署。 + +Milvus 是一款开源的向量数据库,专为海量特征向量的相似性检索而设计。 + +## 镜像构建说明 + +- **基础镜像**: `opencloudos/opencloudos9-minimal:latest` +- **安装方式**: 通过 Milvus 官方 RPM 包安装,所有二进制和库文件均在 OC9 容器内生成 +- **部署模式**: Standalone(内置 etcd + 本地存储) + +## 使用方法 + +```bash +# 启动 Milvus 服务 +docker run -d --name milvus \\ + -p 19530:19530 \\ + -p 9091:9091 \\ + -v milvus-data:/var/lib/milvus \\ + oc9-milvus:2.6.12 + +# 检查健康状态 +curl http://localhost:9091/healthz + +# 使用 Python 客户端连接 +pip install pymilvus +python3 -c "from pymilvus import MilvusClient; c = MilvusClient(uri='http://localhost:19530'); print(c.get_server_version())" +``` + +## 端口说明 + +| 端口 | 用途 | +|------|------| +| 19530 | gRPC API 端口 | +| 9091 | 健康检查和 Metrics 端口 | + +## 环境变量 + +| 变量名 | 默认值 | 说明 | +|--------|--------|------| +| MILVUSCONF | /etc/milvus/configs/ | Milvus 配置文件目录 | +| ETCD_USE_EMBED | true | 使用内置 etcd | +| ETCD_DATA_DIR | /var/lib/milvus/etcd | etcd 数据目录 | +| COMMON_STORAGETYPE | local | 使用本地存储 | +| DEPLOY_MODE | STANDALONE | 独立部署模式 | + +## 测试 + +```bash +bash test.sh oc9-milvus:2.6.12 +``` + +## 参考链接 + +- [Milvus 官方文档](https://milvus.io/docs) +- [Milvus GitHub](https://github.com/milvus-io/milvus) diff --git a/frameworks/milvus/2.6.12/build.conf b/frameworks/milvus/2.6.12/build.conf new file mode 100644 index 0000000000000000000000000000000000000000..58c07248faeae7b918a319f1362b40dfa886dca7 --- /dev/null +++ b/frameworks/milvus/2.6.12/build.conf @@ -0,0 +1,4 @@ +# milvus server 2.6.12 on OpenCloudOS 9 +IMAGE_NAME=oc9-milvus +IMAGE_TAG=2.6.12 +GPU_TEST=false diff --git a/frameworks/milvus/2.6.12/test.sh b/frameworks/milvus/2.6.12/test.sh new file mode 100755 index 0000000000000000000000000000000000000000..8deefccc1f87b07ba284e1331c6d466a037efe36 --- /dev/null +++ b/frameworks/milvus/2.6.12/test.sh @@ -0,0 +1,91 @@ +#!/bin/bash +set -e + +IMAGE="${1:?ERROR: 缺少镜像参数。用法: bash test.sh }" +CONTAINER_NAME="milvus-test-$$" +MILVUS_HOST="localhost" + +echo "=== Milvus Server 功能测试 ===" + +# 1. 验证 milvus 二进制存在 +echo -n "[1/6] 检查 milvus 二进制... " +docker run --rm --entrypoint bash "$IMAGE" -c "test -x /usr/bin/milvus" && echo "✓ 通过" || { echo "✗ 失败"; exit 1; } + +# 2. 验证配置文件存在 +echo -n "[2/6] 检查配置文件... " +docker run --rm --entrypoint bash "$IMAGE" -c "test -f /etc/milvus/configs/milvus.yaml" && echo "✓ 通过" || { echo "✗ 失败"; exit 1; } + +# 3. 验证环境变量 +echo -n "[3/6] 检查环境变量... " +docker run --rm --entrypoint bash "$IMAGE" -c 'test -n "$ETCD_USE_EMBED"' && echo "✓ 通过" || { echo "✗ 失败"; exit 1; } + +# 4. 清理旧容器 +cleanup() { + echo "清理容器..." + docker rm -f $CONTAINER_NAME 2>/dev/null || true +} +trap cleanup EXIT +docker rm -f $CONTAINER_NAME 2>/dev/null || true + +# 5. 启动服务并测试健康端点 +echo "[4/6] 启动 Milvus 服务..." +docker run -d --name $CONTAINER_NAME \ + -p 19530:19530 -p 9091:9091 \ + "$IMAGE" > /dev/null 2>&1 || { echo "✗ 启动失败"; docker logs $CONTAINER_NAME 2>&1 | tail -5; exit 1; } +echo " 容器已启动" + +echo "[5/6] 等待服务就绪(最多 120 秒)..." +for i in $(seq 1 60); do + if curl -sf http://localhost:9091/healthz > /dev/null 2>&1; then + echo " ✓ 服务就绪 (耗时: $((i*2))s)" + break + fi + if [ $i -eq 60 ]; then + echo "✗ 服务启动超时" + docker logs $CONTAINER_NAME 2>&1 | tail -20 + exit 1 + fi + sleep 2 +done + +# 6. 客户端功能测试(使用 pymilvus ) + +echo "[6/6] 运行客户端功能测试..." +docker run --rm --network host python:3.11-slim bash -c ' +pip install -q pymilvus 2>/dev/null +python3 << '"'"'PYEOF'"'"' +from pymilvus import MilvusClient +import random + +client = MilvusClient(uri="http://localhost:19530") +print("Connected to Milvus") + +version = client.get_server_version() +print("Server version:", version) + +if client.has_collection("test_collection"): + client.drop_collection("test_collection") + +client.create_collection(collection_name="test_collection", dimension=4) +print("Collection created") + +data = [{"id": i, "vector": [random.random() for _ in range(4)]} for i in range(10)] +result = client.insert(collection_name="test_collection", data=data) +insert_count = result["insert_count"] +print("Inserted", insert_count, "rows") + +results = client.query(collection_name="test_collection", filter="id > 5", output_fields=["id"]) +print("Query returned", len(results), "results") + +search_results = client.search(collection_name="test_collection", data=[[0.1, 0.2, 0.3, 0.4]], limit=3, output_fields=["id"]) +print("Search returned", len(search_results[0]), "results") + +client.drop_collection("test_collection") +print("Collection dropped") +client.close() +print("All client tests passed!") +PYEOF +' || { echo "✗ 客户端功能测试失败"; exit 1; } + +echo "" +echo "=== 所有测试通过 ==="