diff --git a/frameworks/ollama/0.18.1/Dockerfile b/frameworks/ollama/0.18.1/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..07d782b650bfe2873c574cfbd0f72b5e8a979cb5 --- /dev/null +++ b/frameworks/ollama/0.18.1/Dockerfile @@ -0,0 +1,23 @@ +FROM opencloudos/opencloudos9-cuda-devel:12.8 + +LABEL maintainer="OpenCloudOS Community" +LABEL org.opencontainers.image.source="https://gitee.com/OpenCloudOS/ai-agent-container" +LABEL org.opencontainers.image.description="Ollama v0.18.1 (GPU) on OpenCloudOS 9" + +RUN dnf install -y \ + curl \ + zstd \ + && dnf clean all \ + && rm -rf /var/cache/yum/* + +ARG OLLAMA_VERSION=0.18.1 +RUN curl -fsSL "https://github.com/ollama/ollama/releases/download/v${OLLAMA_VERSION}/ollama-linux-amd64.tar.zst" \ + | zstd -d | tar x -C /usr + +ENV NVIDIA_VISIBLE_DEVICES=all +ENV OLLAMA_HOST=0.0.0.0:11434 +EXPOSE 11434 + +RUN echo $(date +"%Y-%m-%dT%H:%M:%S%z") > /opencloudos_build_date.txt + +CMD ["ollama", "serve"] diff --git a/frameworks/ollama/0.18.1/README.md b/frameworks/ollama/0.18.1/README.md new file mode 100644 index 0000000000000000000000000000000000000000..82c79b0439c054139c3d842ff74e2b1b6f0f4b35 --- /dev/null +++ b/frameworks/ollama/0.18.1/README.md @@ -0,0 +1,68 @@ +# Ollama v0.18.1 on OpenCloudOS 9 + +## 基本信息 + +- **框架版本**:v0.18.1 +- **开源地址**:[https://github.com/ollama/ollama](https://github.com/ollama/ollama) +- **基础镜像**:opencloudos9-cuda-devel:12.8 +- **Python 版本**:N/A(Go 编译二进制,无需 Python) +- **CUDA 版本**:12.8(基础镜像),Ollama 内部自带 CUDA 运行时库 +- **默认端口**:11434 + +## 构建命令 + +```bash +docker build -t oc9-ollama:0.18.1 frameworks/ollama/0.18.1/ +``` + +## 使用示例 + +### 启动 Ollama 服务 + +```bash +docker run -d --gpus all --name ollama \ + -p 11434:11434 \ + -v ollama-models:/root/.ollama \ + oc9-ollama:0.18.1 +``` + +### CPU 模式(不挂载 GPU) + +```bash +docker run -d --name ollama \ + -p 11434:11434 \ + -v ollama-models:/root/.ollama \ + oc9-ollama:0.18.1 +``` + +### 运行模型 + +```bash +# 进入容器拉取并运行模型 +docker exec -it ollama ollama run qwen3:0.6b +``` + +### 调用 API + +```bash +# 查看已安装模型 +curl http://localhost:11434/api/tags + +# 聊天对话 +curl http://localhost:11434/api/chat -d '{ + "model": "qwen3:0.6b", + "messages": [{"role": "user", "content": "你好"}] +}' +``` + +## 技术说明 + +- Ollama 为 Go 编译的独立二进制,内部已打包 CUDA 运行时库,无需额外安装 CUDA +- 使用 `opencloudos9-cuda-devel` 基础镜像以兼容 NVIDIA GPU 驱动 +- 模型数据默认存储在 `/root/.ollama`,建议通过 Volume 持久化 +- 支持 NVIDIA GPU(CUDA)和 CPU 模式自动切换 + +## 已知问题 + +- 首次拉取大模型时需要较长下载时间,建议提前拉取或使用镜像源 +- ARM64 架构需替换 Dockerfile 中的 `amd64` 为 `arm64` diff --git a/frameworks/ollama/0.18.1/build.conf b/frameworks/ollama/0.18.1/build.conf new file mode 100644 index 0000000000000000000000000000000000000000..fbb3bdbe3ebc51692a97b007f5cd6ca9c683e14f --- /dev/null +++ b/frameworks/ollama/0.18.1/build.conf @@ -0,0 +1,4 @@ +# ollama 0.18.1 on OpenCloudOS 9 (GPU) +IMAGE_NAME=oc9-ollama +IMAGE_TAG=0.18.1 +GPU_TEST=false diff --git a/frameworks/ollama/0.18.1/test.sh b/frameworks/ollama/0.18.1/test.sh new file mode 100755 index 0000000000000000000000000000000000000000..5ba461e4dc6c070a22085b11e5df7315a21f40ee --- /dev/null +++ b/frameworks/ollama/0.18.1/test.sh @@ -0,0 +1,110 @@ +#!/usr/bin/env bash +set -e + +IMAGE="${1:-}" +if [ -z "${IMAGE}" ]; then + echo "用法: bash test.sh <镜像名:标签>" >&2 + exit 1 +fi + +command -v docker >/dev/null 2>&1 || { echo "✗ 未找到 docker" >&2; exit 1; } + +echo "=== Ollama 容器基础功能测试 ===" +echo "待测镜像: ${IMAGE}" + +docker run --rm --gpus all \ + -e OLLAMA_BIN="${OLLAMA_BIN:-/usr/bin/ollama}" \ + -e OLLAMA_HOST="${OLLAMA_HOST:-0.0.0.0:11434}" \ + -e START_TIMEOUT="${START_TIMEOUT:-30}" \ + --entrypoint /bin/bash \ + "${IMAGE}" -lc ' +set -Eeuo pipefail + +export CUDA_HOME="${CUDA_HOME:-/usr/local/cuda}" +export PATH="${CUDA_HOME}/bin:${PATH}" +export LD_LIBRARY_PATH="${CUDA_HOME}/lib64:${LD_LIBRARY_PATH:-}" + +OLLAMA_URL="http://${OLLAMA_HOST}/api" +SERVER_PID="" + +pass() { echo "✓ $1"; } +fail() { echo "✗ $1" >&2; exit 1; } + +cleanup() { + [ -n "${SERVER_PID}" ] && kill "${SERVER_PID}" >/dev/null 2>&1 && wait "${SERVER_PID}" 2>/dev/null || true +} +trap cleanup EXIT + +http_get() { + local url="$1" + if command -v curl >/dev/null 2>&1; then + curl -fsS "${url}" + elif command -v wget >/dev/null 2>&1; then + wget -qO- "${url}" + elif command -v python3 >/dev/null 2>&1; then + python3 - "${url}" <<"PY" +import sys +from urllib.request import urlopen + +url = sys.argv[1] +with urlopen(url, timeout=5) as resp: + sys.stdout.write(resp.read().decode("utf-8", errors="replace")) +PY + else + fail "未找到 curl、wget 或 python3,无法检查 HTTP API" + fi +} + +echo "[1/5] 检查 ollama 二进制..." +[ -x "${OLLAMA_BIN}" ] || fail "ollama 未安装或不可执行: ${OLLAMA_BIN}" +pass "ollama 二进制存在" + +echo "[2/5] 检查 ollama 是否可正常运行..." +VERSION_OUT="$(${OLLAMA_BIN} --version 2>&1)" || fail "ollama --version 执行失败" +echo " ${VERSION_OUT}" +pass "ollama 可正常运行" + +echo "[3/5] 检查运行环境信息..." +if command -v nvidia-smi >/dev/null 2>&1; then + nvidia-smi | head -n 3 || true + pass "检测到 nvidia-smi" +else + echo " 未检测到 nvidia-smi,跳过 GPU 检查" + pass "GPU 检查已跳过" +fi + +if command -v nvcc >/dev/null 2>&1; then + nvcc --version | tail -n 2 || true +fi + +echo "[4/5] 启动 ollama API 服务并检查 /api/version..." +"${OLLAMA_BIN}" serve >/tmp/ollama-test.log 2>&1 & +SERVER_PID=$! + +READY=0 +for _ in $(seq 1 "${START_TIMEOUT}"); do + if http_get "${OLLAMA_URL}/version" >/dev/null 2>&1; then + READY=1 + break + fi + sleep 1 +done + +if [ "${READY}" != "1" ]; then + echo "---- ollama 服务日志 ----" + cat /tmp/ollama-test.log || true + echo "------------------------" + fail "ollama serve 启动失败或 ${START_TIMEOUT}s 内未就绪" +fi + +API_VERSION="$(http_get "${OLLAMA_URL}/version")" || fail "访问 /api/version 失败" +echo " ${API_VERSION}" +pass "ollama API 服务正常" + +echo "[5/5] 检查核心 CLI 功能..." +LIST_OUT="$(${OLLAMA_BIN} list 2>&1)" || fail "ollama list 执行失败" +echo "${LIST_OUT}" +pass "ollama list 可正常执行" +' + +echo "✓ 镜像 ${IMAGE} 基础功能测试通过" diff --git a/frameworks/ollama/0.18.1/test_result.png b/frameworks/ollama/0.18.1/test_result.png new file mode 100644 index 0000000000000000000000000000000000000000..3c4c832751a890cd3c226944f79af99c7ef45a6a Binary files /dev/null and b/frameworks/ollama/0.18.1/test_result.png differ diff --git a/frameworks/ollama/0.18.2/Dockerfile b/frameworks/ollama/0.18.2/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..8fe3bda3cc9967fdd96b5b854253a5f7bc47307b --- /dev/null +++ b/frameworks/ollama/0.18.2/Dockerfile @@ -0,0 +1,23 @@ +FROM opencloudos/opencloudos9-cuda-devel:12.8 + +LABEL maintainer="OpenCloudOS Community" +LABEL org.opencontainers.image.source="https://gitee.com/OpenCloudOS/ai-agent-container" +LABEL org.opencontainers.image.description="Ollama v0.18.2 (GPU) on OpenCloudOS 9" + +RUN dnf install -y \ + curl \ + zstd \ + && dnf clean all \ + && rm -rf /var/cache/yum/* + +ARG OLLAMA_VERSION=0.18.2 +RUN curl -fsSL "https://github.com/ollama/ollama/releases/download/v${OLLAMA_VERSION}/ollama-linux-amd64.tar.zst" \ + | zstd -d | tar x -C /usr + +ENV NVIDIA_VISIBLE_DEVICES=all +ENV OLLAMA_HOST=0.0.0.0:11434 +EXPOSE 11434 + +RUN echo $(date +"%Y-%m-%dT%H:%M:%S%z") > /opencloudos_build_date.txt + +CMD ["ollama", "serve"] diff --git a/frameworks/ollama/0.18.2/README.md b/frameworks/ollama/0.18.2/README.md new file mode 100644 index 0000000000000000000000000000000000000000..e0824b905ca5e2c644b652382e8100ce6b01cb74 --- /dev/null +++ b/frameworks/ollama/0.18.2/README.md @@ -0,0 +1,68 @@ +# Ollama v0.18.2 on OpenCloudOS 9 + +## 基本信息 + +- **框架版本**:v0.18.2 +- **开源地址**:[https://github.com/ollama/ollama](https://github.com/ollama/ollama) +- **基础镜像**:opencloudos9-cuda-devel:12.8 +- **Python 版本**:N/A(Go 编译二进制,无需 Python) +- **CUDA 版本**:12.8(基础镜像),Ollama 内部自带 CUDA 运行时库 +- **默认端口**:11434 + +## 构建命令 + +```bash +docker build -t oc9-ollama:0.18.2 frameworks/ollama/0.18.2/ +``` + +## 使用示例 + +### 启动 Ollama 服务 + +```bash +docker run -d --gpus all --name ollama \ + -p 11434:11434 \ + -v ollama-models:/root/.ollama \ + oc9-ollama:0.18.2 +``` + +### CPU 模式(不挂载 GPU) + +```bash +docker run -d --name ollama \ + -p 11434:11434 \ + -v ollama-models:/root/.ollama \ + oc9-ollama:0.18.2 +``` + +### 运行模型 + +```bash +# 进入容器拉取并运行模型 +docker exec -it ollama ollama run qwen3:0.6b +``` + +### 调用 API + +```bash +# 查看已安装模型 +curl http://localhost:11434/api/tags + +# 聊天对话 +curl http://localhost:11434/api/chat -d '{ + "model": "qwen3:0.6b", + "messages": [{"role": "user", "content": "你好"}] +}' +``` + +## 技术说明 + +- Ollama 为 Go 编译的独立二进制,内部已打包 CUDA 运行时库,无需额外安装 CUDA +- 使用 `opencloudos9-cuda-devel` 基础镜像以兼容 NVIDIA GPU 驱动 +- 模型数据默认存储在 `/root/.ollama`,建议通过 Volume 持久化 +- 支持 NVIDIA GPU(CUDA)和 CPU 模式自动切换 + +## 已知问题 + +- 首次拉取大模型时需要较长下载时间,建议提前拉取或使用镜像源 +- ARM64 架构需替换 Dockerfile 中的 `amd64` 为 `arm64` diff --git a/frameworks/ollama/0.18.2/build.conf b/frameworks/ollama/0.18.2/build.conf new file mode 100644 index 0000000000000000000000000000000000000000..43d9b2cea650f04ade191aa1e7851472141f04b4 --- /dev/null +++ b/frameworks/ollama/0.18.2/build.conf @@ -0,0 +1,4 @@ +# ollama 0.18.2 on OpenCloudOS 9 (GPU) +IMAGE_NAME=oc9-ollama +IMAGE_TAG=0.18.2 +GPU_TEST=false diff --git a/frameworks/ollama/0.18.2/test.sh b/frameworks/ollama/0.18.2/test.sh new file mode 100755 index 0000000000000000000000000000000000000000..5ba461e4dc6c070a22085b11e5df7315a21f40ee --- /dev/null +++ b/frameworks/ollama/0.18.2/test.sh @@ -0,0 +1,110 @@ +#!/usr/bin/env bash +set -e + +IMAGE="${1:-}" +if [ -z "${IMAGE}" ]; then + echo "用法: bash test.sh <镜像名:标签>" >&2 + exit 1 +fi + +command -v docker >/dev/null 2>&1 || { echo "✗ 未找到 docker" >&2; exit 1; } + +echo "=== Ollama 容器基础功能测试 ===" +echo "待测镜像: ${IMAGE}" + +docker run --rm --gpus all \ + -e OLLAMA_BIN="${OLLAMA_BIN:-/usr/bin/ollama}" \ + -e OLLAMA_HOST="${OLLAMA_HOST:-0.0.0.0:11434}" \ + -e START_TIMEOUT="${START_TIMEOUT:-30}" \ + --entrypoint /bin/bash \ + "${IMAGE}" -lc ' +set -Eeuo pipefail + +export CUDA_HOME="${CUDA_HOME:-/usr/local/cuda}" +export PATH="${CUDA_HOME}/bin:${PATH}" +export LD_LIBRARY_PATH="${CUDA_HOME}/lib64:${LD_LIBRARY_PATH:-}" + +OLLAMA_URL="http://${OLLAMA_HOST}/api" +SERVER_PID="" + +pass() { echo "✓ $1"; } +fail() { echo "✗ $1" >&2; exit 1; } + +cleanup() { + [ -n "${SERVER_PID}" ] && kill "${SERVER_PID}" >/dev/null 2>&1 && wait "${SERVER_PID}" 2>/dev/null || true +} +trap cleanup EXIT + +http_get() { + local url="$1" + if command -v curl >/dev/null 2>&1; then + curl -fsS "${url}" + elif command -v wget >/dev/null 2>&1; then + wget -qO- "${url}" + elif command -v python3 >/dev/null 2>&1; then + python3 - "${url}" <<"PY" +import sys +from urllib.request import urlopen + +url = sys.argv[1] +with urlopen(url, timeout=5) as resp: + sys.stdout.write(resp.read().decode("utf-8", errors="replace")) +PY + else + fail "未找到 curl、wget 或 python3,无法检查 HTTP API" + fi +} + +echo "[1/5] 检查 ollama 二进制..." +[ -x "${OLLAMA_BIN}" ] || fail "ollama 未安装或不可执行: ${OLLAMA_BIN}" +pass "ollama 二进制存在" + +echo "[2/5] 检查 ollama 是否可正常运行..." +VERSION_OUT="$(${OLLAMA_BIN} --version 2>&1)" || fail "ollama --version 执行失败" +echo " ${VERSION_OUT}" +pass "ollama 可正常运行" + +echo "[3/5] 检查运行环境信息..." +if command -v nvidia-smi >/dev/null 2>&1; then + nvidia-smi | head -n 3 || true + pass "检测到 nvidia-smi" +else + echo " 未检测到 nvidia-smi,跳过 GPU 检查" + pass "GPU 检查已跳过" +fi + +if command -v nvcc >/dev/null 2>&1; then + nvcc --version | tail -n 2 || true +fi + +echo "[4/5] 启动 ollama API 服务并检查 /api/version..." +"${OLLAMA_BIN}" serve >/tmp/ollama-test.log 2>&1 & +SERVER_PID=$! + +READY=0 +for _ in $(seq 1 "${START_TIMEOUT}"); do + if http_get "${OLLAMA_URL}/version" >/dev/null 2>&1; then + READY=1 + break + fi + sleep 1 +done + +if [ "${READY}" != "1" ]; then + echo "---- ollama 服务日志 ----" + cat /tmp/ollama-test.log || true + echo "------------------------" + fail "ollama serve 启动失败或 ${START_TIMEOUT}s 内未就绪" +fi + +API_VERSION="$(http_get "${OLLAMA_URL}/version")" || fail "访问 /api/version 失败" +echo " ${API_VERSION}" +pass "ollama API 服务正常" + +echo "[5/5] 检查核心 CLI 功能..." +LIST_OUT="$(${OLLAMA_BIN} list 2>&1)" || fail "ollama list 执行失败" +echo "${LIST_OUT}" +pass "ollama list 可正常执行" +' + +echo "✓ 镜像 ${IMAGE} 基础功能测试通过" diff --git a/frameworks/ollama/0.18.2/test_result.png b/frameworks/ollama/0.18.2/test_result.png new file mode 100644 index 0000000000000000000000000000000000000000..2afd74340de84b0c1d3dc55629d46961d310281e Binary files /dev/null and b/frameworks/ollama/0.18.2/test_result.png differ diff --git a/frameworks/ollama/0.18.3/Dockerfile b/frameworks/ollama/0.18.3/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..fa9e0165b310ae1be3fcc0ca73106e3eb359e0cb --- /dev/null +++ b/frameworks/ollama/0.18.3/Dockerfile @@ -0,0 +1,23 @@ +FROM opencloudos/opencloudos9-cuda-devel:12.8 + +LABEL maintainer="OpenCloudOS Community" +LABEL org.opencontainers.image.source="https://gitee.com/OpenCloudOS/ai-agent-container" +LABEL org.opencontainers.image.description="Ollama v0.18.3 (GPU) on OpenCloudOS 9" + +RUN dnf install -y \ + curl \ + zstd \ + && dnf clean all \ + && rm -rf /var/cache/yum/* + +ARG OLLAMA_VERSION=0.18.3 +RUN curl -fsSL "https://github.com/ollama/ollama/releases/download/v${OLLAMA_VERSION}/ollama-linux-amd64.tar.zst" \ + | zstd -d | tar x -C /usr + +ENV NVIDIA_VISIBLE_DEVICES=all +ENV OLLAMA_HOST=0.0.0.0:11434 +EXPOSE 11434 + +RUN echo $(date +"%Y-%m-%dT%H:%M:%S%z") > /opencloudos_build_date.txt + +CMD ["ollama", "serve"] diff --git a/frameworks/ollama/0.18.3/README.md b/frameworks/ollama/0.18.3/README.md new file mode 100644 index 0000000000000000000000000000000000000000..f66d90e240bab863767be597c29002a1480f3386 --- /dev/null +++ b/frameworks/ollama/0.18.3/README.md @@ -0,0 +1,68 @@ +# Ollama v0.18.3 on OpenCloudOS 9 + +## 基本信息 + +- **框架版本**:v0.18.3 +- **开源地址**:[https://github.com/ollama/ollama](https://github.com/ollama/ollama) +- **基础镜像**:opencloudos9-cuda-devel:12.8 +- **Python 版本**:N/A(Go 编译二进制,无需 Python) +- **CUDA 版本**:12.8(基础镜像),Ollama 内部自带 CUDA 运行时库 +- **默认端口**:11434 + +## 构建命令 + +```bash +docker build -t oc9-ollama:0.18.3 frameworks/ollama/0.18.3/ +``` + +## 使用示例 + +### 启动 Ollama 服务 + +```bash +docker run -d --gpus all --name ollama \ + -p 11434:11434 \ + -v ollama-models:/root/.ollama \ + oc9-ollama:0.18.3 +``` + +### CPU 模式(不挂载 GPU) + +```bash +docker run -d --name ollama \ + -p 11434:11434 \ + -v ollama-models:/root/.ollama \ + oc9-ollama:0.18.3 +``` + +### 运行模型 + +```bash +# 进入容器拉取并运行模型 +docker exec -it ollama ollama run qwen3:0.6b +``` + +### 调用 API + +```bash +# 查看已安装模型 +curl http://localhost:11434/api/tags + +# 聊天对话 +curl http://localhost:11434/api/chat -d '{ + "model": "qwen3:0.6b", + "messages": [{"role": "user", "content": "你好"}] +}' +``` + +## 技术说明 + +- Ollama 为 Go 编译的独立二进制,内部已打包 CUDA 运行时库,无需额外安装 CUDA +- 使用 `opencloudos9-cuda-devel` 基础镜像以兼容 NVIDIA GPU 驱动 +- 模型数据默认存储在 `/root/.ollama`,建议通过 Volume 持久化 +- 支持 NVIDIA GPU(CUDA)和 CPU 模式自动切换 + +## 已知问题 + +- 首次拉取大模型时需要较长下载时间,建议提前拉取或使用镜像源 +- ARM64 架构需替换 Dockerfile 中的 `amd64` 为 `arm64` diff --git a/frameworks/ollama/0.18.3/build.conf b/frameworks/ollama/0.18.3/build.conf new file mode 100644 index 0000000000000000000000000000000000000000..6018ad744fc1576538a8126eec47ab885f51efa5 --- /dev/null +++ b/frameworks/ollama/0.18.3/build.conf @@ -0,0 +1,4 @@ +# ollama 0.18.3 on OpenCloudOS 9 (GPU) +IMAGE_NAME=oc9-ollama +IMAGE_TAG=0.18.3 +GPU_TEST=false diff --git a/frameworks/ollama/0.18.3/test.sh b/frameworks/ollama/0.18.3/test.sh new file mode 100755 index 0000000000000000000000000000000000000000..5ba461e4dc6c070a22085b11e5df7315a21f40ee --- /dev/null +++ b/frameworks/ollama/0.18.3/test.sh @@ -0,0 +1,110 @@ +#!/usr/bin/env bash +set -e + +IMAGE="${1:-}" +if [ -z "${IMAGE}" ]; then + echo "用法: bash test.sh <镜像名:标签>" >&2 + exit 1 +fi + +command -v docker >/dev/null 2>&1 || { echo "✗ 未找到 docker" >&2; exit 1; } + +echo "=== Ollama 容器基础功能测试 ===" +echo "待测镜像: ${IMAGE}" + +docker run --rm --gpus all \ + -e OLLAMA_BIN="${OLLAMA_BIN:-/usr/bin/ollama}" \ + -e OLLAMA_HOST="${OLLAMA_HOST:-0.0.0.0:11434}" \ + -e START_TIMEOUT="${START_TIMEOUT:-30}" \ + --entrypoint /bin/bash \ + "${IMAGE}" -lc ' +set -Eeuo pipefail + +export CUDA_HOME="${CUDA_HOME:-/usr/local/cuda}" +export PATH="${CUDA_HOME}/bin:${PATH}" +export LD_LIBRARY_PATH="${CUDA_HOME}/lib64:${LD_LIBRARY_PATH:-}" + +OLLAMA_URL="http://${OLLAMA_HOST}/api" +SERVER_PID="" + +pass() { echo "✓ $1"; } +fail() { echo "✗ $1" >&2; exit 1; } + +cleanup() { + [ -n "${SERVER_PID}" ] && kill "${SERVER_PID}" >/dev/null 2>&1 && wait "${SERVER_PID}" 2>/dev/null || true +} +trap cleanup EXIT + +http_get() { + local url="$1" + if command -v curl >/dev/null 2>&1; then + curl -fsS "${url}" + elif command -v wget >/dev/null 2>&1; then + wget -qO- "${url}" + elif command -v python3 >/dev/null 2>&1; then + python3 - "${url}" <<"PY" +import sys +from urllib.request import urlopen + +url = sys.argv[1] +with urlopen(url, timeout=5) as resp: + sys.stdout.write(resp.read().decode("utf-8", errors="replace")) +PY + else + fail "未找到 curl、wget 或 python3,无法检查 HTTP API" + fi +} + +echo "[1/5] 检查 ollama 二进制..." +[ -x "${OLLAMA_BIN}" ] || fail "ollama 未安装或不可执行: ${OLLAMA_BIN}" +pass "ollama 二进制存在" + +echo "[2/5] 检查 ollama 是否可正常运行..." +VERSION_OUT="$(${OLLAMA_BIN} --version 2>&1)" || fail "ollama --version 执行失败" +echo " ${VERSION_OUT}" +pass "ollama 可正常运行" + +echo "[3/5] 检查运行环境信息..." +if command -v nvidia-smi >/dev/null 2>&1; then + nvidia-smi | head -n 3 || true + pass "检测到 nvidia-smi" +else + echo " 未检测到 nvidia-smi,跳过 GPU 检查" + pass "GPU 检查已跳过" +fi + +if command -v nvcc >/dev/null 2>&1; then + nvcc --version | tail -n 2 || true +fi + +echo "[4/5] 启动 ollama API 服务并检查 /api/version..." +"${OLLAMA_BIN}" serve >/tmp/ollama-test.log 2>&1 & +SERVER_PID=$! + +READY=0 +for _ in $(seq 1 "${START_TIMEOUT}"); do + if http_get "${OLLAMA_URL}/version" >/dev/null 2>&1; then + READY=1 + break + fi + sleep 1 +done + +if [ "${READY}" != "1" ]; then + echo "---- ollama 服务日志 ----" + cat /tmp/ollama-test.log || true + echo "------------------------" + fail "ollama serve 启动失败或 ${START_TIMEOUT}s 内未就绪" +fi + +API_VERSION="$(http_get "${OLLAMA_URL}/version")" || fail "访问 /api/version 失败" +echo " ${API_VERSION}" +pass "ollama API 服务正常" + +echo "[5/5] 检查核心 CLI 功能..." +LIST_OUT="$(${OLLAMA_BIN} list 2>&1)" || fail "ollama list 执行失败" +echo "${LIST_OUT}" +pass "ollama list 可正常执行" +' + +echo "✓ 镜像 ${IMAGE} 基础功能测试通过" diff --git a/frameworks/ollama/0.18.3/test_result.png b/frameworks/ollama/0.18.3/test_result.png new file mode 100644 index 0000000000000000000000000000000000000000..df3182169a653849a9203beebff246f9f14c03ae Binary files /dev/null and b/frameworks/ollama/0.18.3/test_result.png differ diff --git a/frameworks/ollama/0.18.4/Dockerfile b/frameworks/ollama/0.18.4/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..79c80315f49fb624fda03c8b74412b6bafa927c7 --- /dev/null +++ b/frameworks/ollama/0.18.4/Dockerfile @@ -0,0 +1,23 @@ +FROM opencloudos/opencloudos9-cuda-devel:12.8 + +LABEL maintainer="OpenCloudOS Community" +LABEL org.opencontainers.image.source="https://gitee.com/OpenCloudOS/ai-agent-container" +LABEL org.opencontainers.image.description="Ollama v0.18.4 (GPU) on OpenCloudOS 9" + +RUN dnf install -y \ + curl \ + zstd \ + && dnf clean all \ + && rm -rf /var/cache/yum/* + +ARG OLLAMA_VERSION=0.18.4-rc0 +RUN curl -fsSL "https://github.com/ollama/ollama/releases/download/v${OLLAMA_VERSION}/ollama-linux-amd64.tar.zst" \ + | zstd -d | tar x -C /usr + +ENV NVIDIA_VISIBLE_DEVICES=all +ENV OLLAMA_HOST=0.0.0.0:11434 +EXPOSE 11434 + +RUN echo $(date +"%Y-%m-%dT%H:%M:%S%z") > /opencloudos_build_date.txt + +CMD ["ollama", "serve"] diff --git a/frameworks/ollama/0.18.4/README.md b/frameworks/ollama/0.18.4/README.md new file mode 100644 index 0000000000000000000000000000000000000000..b68e108e91a9b245087eeb6ee7201d0d3e0bd3fc --- /dev/null +++ b/frameworks/ollama/0.18.4/README.md @@ -0,0 +1,68 @@ +# Ollama v0.18.4 on OpenCloudOS 9 + +## 基本信息 + +- **框架版本**:v0.18.4 +- **开源地址**:[https://github.com/ollama/ollama](https://github.com/ollama/ollama) +- **基础镜像**:opencloudos9-cuda-devel:12.8 +- **Python 版本**:N/A(Go 编译二进制,无需 Python) +- **CUDA 版本**:12.8(基础镜像),Ollama 内部自带 CUDA 运行时库 +- **默认端口**:11434 + +## 构建命令 + +```bash +docker build -t oc9-ollama:0.18.4 frameworks/ollama/0.18.4/ +``` + +## 使用示例 + +### 启动 Ollama 服务 + +```bash +docker run -d --gpus all --name ollama \ + -p 11434:11434 \ + -v ollama-models:/root/.ollama \ + oc9-ollama:0.18.4 +``` + +### CPU 模式(不挂载 GPU) + +```bash +docker run -d --name ollama \ + -p 11434:11434 \ + -v ollama-models:/root/.ollama \ + oc9-ollama:0.18.4 +``` + +### 运行模型 + +```bash +# 进入容器拉取并运行模型 +docker exec -it ollama ollama run qwen3:0.6b +``` + +### 调用 API + +```bash +# 查看已安装模型 +curl http://localhost:11434/api/tags + +# 聊天对话 +curl http://localhost:11434/api/chat -d '{ + "model": "qwen3:0.6b", + "messages": [{"role": "user", "content": "你好"}] +}' +``` + +## 技术说明 + +- Ollama 为 Go 编译的独立二进制,内部已打包 CUDA 运行时库,无需额外安装 CUDA +- 使用 `opencloudos9-cuda-devel` 基础镜像以兼容 NVIDIA GPU 驱动 +- 模型数据默认存储在 `/root/.ollama`,建议通过 Volume 持久化 +- 支持 NVIDIA GPU(CUDA)和 CPU 模式自动切换 + +## 已知问题 + +- 首次拉取大模型时需要较长下载时间,建议提前拉取或使用镜像源 +- ARM64 架构需替换 Dockerfile 中的 `amd64` 为 `arm64` diff --git a/frameworks/ollama/0.18.4/build.conf b/frameworks/ollama/0.18.4/build.conf new file mode 100644 index 0000000000000000000000000000000000000000..848d84b62a28b132ae69dbb8fdd4ab728b9edf4a --- /dev/null +++ b/frameworks/ollama/0.18.4/build.conf @@ -0,0 +1,4 @@ +# ollama 0.18.4 on OpenCloudOS 9 (GPU) +IMAGE_NAME=oc9-ollama +IMAGE_TAG=0.18.4 +GPU_TEST=false diff --git a/frameworks/ollama/0.18.4/test.sh b/frameworks/ollama/0.18.4/test.sh new file mode 100755 index 0000000000000000000000000000000000000000..5ba461e4dc6c070a22085b11e5df7315a21f40ee --- /dev/null +++ b/frameworks/ollama/0.18.4/test.sh @@ -0,0 +1,110 @@ +#!/usr/bin/env bash +set -e + +IMAGE="${1:-}" +if [ -z "${IMAGE}" ]; then + echo "用法: bash test.sh <镜像名:标签>" >&2 + exit 1 +fi + +command -v docker >/dev/null 2>&1 || { echo "✗ 未找到 docker" >&2; exit 1; } + +echo "=== Ollama 容器基础功能测试 ===" +echo "待测镜像: ${IMAGE}" + +docker run --rm --gpus all \ + -e OLLAMA_BIN="${OLLAMA_BIN:-/usr/bin/ollama}" \ + -e OLLAMA_HOST="${OLLAMA_HOST:-0.0.0.0:11434}" \ + -e START_TIMEOUT="${START_TIMEOUT:-30}" \ + --entrypoint /bin/bash \ + "${IMAGE}" -lc ' +set -Eeuo pipefail + +export CUDA_HOME="${CUDA_HOME:-/usr/local/cuda}" +export PATH="${CUDA_HOME}/bin:${PATH}" +export LD_LIBRARY_PATH="${CUDA_HOME}/lib64:${LD_LIBRARY_PATH:-}" + +OLLAMA_URL="http://${OLLAMA_HOST}/api" +SERVER_PID="" + +pass() { echo "✓ $1"; } +fail() { echo "✗ $1" >&2; exit 1; } + +cleanup() { + [ -n "${SERVER_PID}" ] && kill "${SERVER_PID}" >/dev/null 2>&1 && wait "${SERVER_PID}" 2>/dev/null || true +} +trap cleanup EXIT + +http_get() { + local url="$1" + if command -v curl >/dev/null 2>&1; then + curl -fsS "${url}" + elif command -v wget >/dev/null 2>&1; then + wget -qO- "${url}" + elif command -v python3 >/dev/null 2>&1; then + python3 - "${url}" <<"PY" +import sys +from urllib.request import urlopen + +url = sys.argv[1] +with urlopen(url, timeout=5) as resp: + sys.stdout.write(resp.read().decode("utf-8", errors="replace")) +PY + else + fail "未找到 curl、wget 或 python3,无法检查 HTTP API" + fi +} + +echo "[1/5] 检查 ollama 二进制..." +[ -x "${OLLAMA_BIN}" ] || fail "ollama 未安装或不可执行: ${OLLAMA_BIN}" +pass "ollama 二进制存在" + +echo "[2/5] 检查 ollama 是否可正常运行..." +VERSION_OUT="$(${OLLAMA_BIN} --version 2>&1)" || fail "ollama --version 执行失败" +echo " ${VERSION_OUT}" +pass "ollama 可正常运行" + +echo "[3/5] 检查运行环境信息..." +if command -v nvidia-smi >/dev/null 2>&1; then + nvidia-smi | head -n 3 || true + pass "检测到 nvidia-smi" +else + echo " 未检测到 nvidia-smi,跳过 GPU 检查" + pass "GPU 检查已跳过" +fi + +if command -v nvcc >/dev/null 2>&1; then + nvcc --version | tail -n 2 || true +fi + +echo "[4/5] 启动 ollama API 服务并检查 /api/version..." +"${OLLAMA_BIN}" serve >/tmp/ollama-test.log 2>&1 & +SERVER_PID=$! + +READY=0 +for _ in $(seq 1 "${START_TIMEOUT}"); do + if http_get "${OLLAMA_URL}/version" >/dev/null 2>&1; then + READY=1 + break + fi + sleep 1 +done + +if [ "${READY}" != "1" ]; then + echo "---- ollama 服务日志 ----" + cat /tmp/ollama-test.log || true + echo "------------------------" + fail "ollama serve 启动失败或 ${START_TIMEOUT}s 内未就绪" +fi + +API_VERSION="$(http_get "${OLLAMA_URL}/version")" || fail "访问 /api/version 失败" +echo " ${API_VERSION}" +pass "ollama API 服务正常" + +echo "[5/5] 检查核心 CLI 功能..." +LIST_OUT="$(${OLLAMA_BIN} list 2>&1)" || fail "ollama list 执行失败" +echo "${LIST_OUT}" +pass "ollama list 可正常执行" +' + +echo "✓ 镜像 ${IMAGE} 基础功能测试通过" diff --git a/frameworks/ollama/0.18.4/test_result.png b/frameworks/ollama/0.18.4/test_result.png new file mode 100644 index 0000000000000000000000000000000000000000..eb7c5ebd7afbc1d3d1308d26c1cf8989fb9ff50e Binary files /dev/null and b/frameworks/ollama/0.18.4/test_result.png differ